Compare commits

...

63 Commits

Author SHA1 Message Date
firestar5683 847d19d029 Microslop 2026-06-03 22:00:28 -05:00
firestar5683 1554392614 build 2026-06-02 20:08:09 -05:00
firestar5683 2486728e11 hi 2026-06-02 20:05:38 -05:00
firestarsdog 3cf48ae3c8 BigUI WIP: Some CEM Stuff 2026-06-02 17:49:10 -04:00
firestar5683 e44e612465 build 2026-06-02 14:26:19 -05:00
whoisdomi 78e9b5139c Faster Leads for $300 Trebek, and say hi to your motha
Faster takeoffs after leads and green lights.
2026-06-02 14:12:21 -05:00
whoisdomi d2a8163f32 Human Lane Change ui fix
Toggled on, would show adjecent radar leads, even if that toggle was off.
Now gated to its toggle in developer ui.
2026-06-02 14:12:20 -05:00
firestar5683 9f30661f6d long planner / i5 / sonata 2026-06-02 11:18:34 -05:00
firestar5683 5632559e5a fcw 2026-06-02 10:31:16 -05:00
firestar5683 ae2f502767 g90 long 2026-06-02 00:29:10 -05:00
firestarsdog 669143a178 BUICK_LACROSSE_ASCM 2026-06-02 00:07:16 -04:00
firestar5683 54cb76ddfd build 2026-06-01 20:52:31 -05:00
whoisdomi fabf122627 Wheel controls qt fix 2026-06-01 20:50:11 -05:00
whoisdomi 3486c695b8 QT StarPilot Logo 2026-06-01 20:50:11 -05:00
whoisdomi 6eb513501d Fire Firehose 2026-06-01 20:50:11 -05:00
whoisdomi 45060a07b7 Add CC Main and LKAS buttons to Wheel Controls
Clean up so all buttons are handled from wheel controls
2026-06-01 20:50:11 -05:00
firestarsdog 7f5e78fd8f BigUI WIP: Delete Stuff 2026-06-01 02:51:51 -04:00
firestarsdog b178e67ae5 BigUI WIP: Scale up dialogs 2026-06-01 02:31:32 -04:00
firestarsdog 026c83fb1b BigUI WIP: Align System Settings, again... 2026-06-01 02:13:23 -04:00
firestarsdog c7b3251918 BigUI WIP: System Settings Bump 2026-06-01 01:46:36 -04:00
firestarsdog 14f94151a5 BigUP WIP: System Settings Pass 2026-06-01 01:19:50 -04:00
firestar5683 6dc473713c i5 2026-06-01 00:10:14 -05:00
firestarsdog 594f525c0c BigUI WIP: System Settings Cleanup Pass 2026-06-01 00:39:18 -04:00
firestar5683 2132a5ceb0 build 2026-05-31 21:06:39 -05:00
firestar5683 5d86b7ac5b IsRHD 2026-05-31 21:03:42 -05:00
firestarsdog 0e7123d632 BigUI WIP: Huh need this afterall 2026-05-31 16:56:39 -04:00
firestarsdog b96c9290f7 BigUI WIP: Settings Cleanup 2026-05-31 16:48:12 -04:00
firestarsdog 416b5e3cd2 BigUI WIP: System Settings update 2026-05-31 15:57:01 -04:00
firestar5683 8a3a872a93 build 2026-05-31 13:45:41 -05:00
firestar5683 6f5690618f param 2026-05-31 13:42:11 -05:00
firestarsdog fad4434104 Expose Python UI Screen Timeout Variables 2026-05-31 14:40:08 -04:00
firestarsdog 86359bacab BigUI WIP: Sounds Default=Auto 2026-05-31 14:00:03 -04:00
firestarsdog a7d8d7a544 BigUP WIP: Sound Polish 2026-05-31 13:53:06 -04:00
firestar5683 86d059bdb4 long 2026-05-31 12:37:09 -05:00
firestar5683 caa5f41b1e radars 2026-05-31 12:26:54 -05:00
firestar5683 fcda700625 nav fixes 2026-05-31 12:14:04 -05:00
firestarsdog cdca40f018 BigUI WIP: Sound Panel Alignment 2026-05-31 04:27:57 -04:00
firestarsdog 736c344cdd BigUI WIP: Sheep > Goat 2026-05-31 02:27:54 -04:00
firestarsdog a28250c81b BigUI WIP: Icons and removal of magic math 2026-05-31 02:14:32 -04:00
firestar5683 b406a1a9d8 nightly roundup 2026-05-31 00:55:43 -05:00
firestarsdog a44e306343 Hm.. XT5? lol 2026-05-30 23:00:45 -04:00
firestarsdog ecbed0f4f8 BigUI WIP: Remove dock lol 2026-05-30 21:31:43 -04:00
firestar5683 04273eefad above 2026-05-30 14:41:03 -05:00
firestar5683 bd5436c55f nav / planner / sonata buttons 2026-05-30 14:26:09 -05:00
firestarsdog 6ca397b840 BigUI WIP: Optimizations 2026-05-30 03:24:04 -04:00
firestarsdog cc2b53a6e9 BigUI WIP: Drop starpilot_icon 2026-05-29 18:10:59 -04:00
firestar5683 6c4717cc39 g90test 2026-05-29 16:07:34 -05:00
firestar5683 6afdc99dd5 redneck 2026-05-29 15:57:20 -05:00
firestarsdog 07fcbbdab8 BigUI WIP: Poof 2026-05-29 16:38:59 -04:00
firestar5683 d55d1bff69 fort hey 2026-05-29 14:42:42 -05:00
firestarsdog a80d3680d0 BigUI WIP: Remove icon code 2026-05-29 15:36:11 -04:00
firestar5683 9673c72d44 bleehhhhh 2026-05-29 14:29:49 -05:00
firestar5683 7051b79674 nav 2026-05-29 14:15:46 -05:00
elkoled e7fa0f51a6 comment
(cherry picked from commit 81fceadb7817b831e47e679a07f515b02950e6e8)
2026-05-29 13:56:21 -05:00
elkoled e9dc540f64 adjust fan setpoint
(cherry picked from commit 269d2189b2383fa5b7c0d5e7cab4fb527f29a636)
2026-05-29 13:56:18 -05:00
firestar5683 e26a91147d build 2026-05-29 13:50:51 -05:00
firestar5683 3de95a341a bokoblin loves mutton; I fix the button 2026-05-29 13:48:07 -05:00
firestar5683 dff6f898a8 done goofed 2026-05-29 12:07:46 -05:00
firestar5683 dfd614c31f build 2026-05-29 12:00:14 -05:00
whoisdomi 5020d33748 ui+selfdrived: pin UI after init, move selfdrived to core 5
Move the UI core-affinity pin to after MainWindow init so startup and
restart recovery can use all cores (pinning before init starved the
restarting UI on the contended little cores, stretching recovery from
~30s to minutes). Move selfdrived off the saturated core 4 onto core 5
so its 100 Hz loop is no longer starved, eliminating selfdrivedLagging.

Verified over a full drive: selfdrivedLagging=0, core4/core5 sustained
>=95% only 0.3%/1.2% of the time, UI restart recovery ~15s with the
device staying engaged, radar tracking unaffected.
2026-05-29 11:56:33 -05:00
firestarsdog bd687f353f BigUI WIP: Sine Bonis P1 2026-05-29 03:40:04 -04:00
firestar5683 ce19d2c5f0 Bat bat come under my hat 2026-05-29 01:18:27 -05:00
firestar5683 29ade037d3 Offer applies with enrollment and triple advantage 2026-05-29 00:55:19 -05:00
171 changed files with 12066 additions and 3256 deletions
Binary file not shown.
+6 -2
View File
@@ -11,7 +11,6 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"AlwaysAllowUploads", {PERSISTENT, BOOL, "0"}},
{"AlwaysOnDM", {PERSISTENT, BOOL}},
{"ApiCache_Device", {PERSISTENT, STRING}},
{"ApiCache_FirehoseStats", {PERSISTENT, JSON}},
{"AssistNowToken", {PERSISTENT, STRING}},
{"AthenadPid", {PERSISTENT, INT}},
{"AthenadUploadQueue", {PERSISTENT, JSON}},
@@ -68,7 +67,9 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"IsMetric", {PERSISTENT, BOOL}},
{"IsOffroad", {CLEAR_ON_MANAGER_START, BOOL}},
{"IsOnroad", {PERSISTENT, BOOL}},
{"IsRHD", {PERSISTENT, BOOL}},
{"IsRhdDetected", {PERSISTENT, BOOL}},
{"IsRHDOverride", {PERSISTENT, BOOL}},
{"IsReleaseBranch", {CLEAR_ON_MANAGER_START, BOOL}},
{"IsTakingSnapshot", {CLEAR_ON_MANAGER_START, BOOL}},
{"IsTestedBranch", {CLEAR_ON_MANAGER_START, BOOL}},
@@ -221,6 +222,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"CustomPersonalities", {PERSISTENT, BOOL, "0", "0", 2}},
{"CancelButtonControl", {PERSISTENT, INT, "1", "0", 2}},
{"CancelButtonControlsMigrated", {PERSISTENT, BOOL, "0", "0"}},
{"AOLLKASMigratedToButtonControl", {PERSISTENT, BOOL, "0", "0"}},
{"TrafficPersonalityProfile", {PERSISTENT, BOOL, "1", "1", 2}},
{"AggressivePersonalityProfile", {PERSISTENT, BOOL, "1", "1", 2}},
{"StandardPersonalityProfile", {PERSISTENT, BOOL, "1", "1", 2}},
@@ -366,6 +368,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"LongitudinalTune", {PERSISTENT, BOOL, "1", "0", 0}},
{"LoudBlindspotAlert", {PERSISTENT, BOOL, "0", "0", 0}},
{"LowVoltageShutdown", {PERSISTENT, FLOAT, "11.8", "11.8", 3}},
{"MainCruiseButtonControl", {PERSISTENT, INT, "9", "9", 2}},
{"ManualUpdateInitiated", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}},
{"AMapKey1", {PERSISTENT | DONT_LOG, STRING, "", "", 0}},
{"AMapKey2", {PERSISTENT | DONT_LOG, STRING, "", "", 0}},
@@ -381,7 +384,8 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"MapSpeedLimit", {CLEAR_ON_MANAGER_START, FLOAT, "0.0", "0.0"}},
{"NavDesiresAllowed", {PERSISTENT, BOOL, "1", "0", 2}},
{"NavLongitudinalAllowed", {PERSISTENT, BOOL, "1", "0", 2}},
{"NavDestination", {PERSISTENT, STRING, "", ""}},
{"NavDestination", {PERSISTENT | CLEAR_ON_MANAGER_START, STRING, "", ""}},
{"NavInstructionCollapsed", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL, "0", "0"}},
{"NavInstructionState", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, JSON, "{}", "{}"}},
{"NextMapSpeedLimit", {CLEAR_ON_MANAGER_START, JSON, "{}", "{}"}},
{"VisionSpeedLimit", {CLEAR_ON_MANAGER_START, FLOAT, "0.0", "0.0"}},
Binary file not shown.
+2 -2
View File
@@ -133,8 +133,8 @@ class TestParams:
def test_params_get_type(self):
# json
self.params.put("ApiCache_FirehoseStats", {"a": 0})
assert self.params.get("ApiCache_FirehoseStats") == {"a": 0}
self.params.put("ApiCache_DriveStats", {"a": 0})
assert self.params.get("ApiCache_DriveStats") == {"a": 0}
# int
self.params.put("BootCount", 1441)
@@ -0,0 +1,8 @@
from opendbc.car.gm.values import AccState, CAR
def get_stock_cc_active_for_cancel(CP, CS):
stock_cc_active = CS.out.cruiseState.enabled or CS.pcm_acc_status != AccState.OFF
if CP.carFingerprint == CAR.CHEVROLET_BOLT_ACC_2022_2023_PEDAL:
return CS.out.cruiseState.enabled
return stock_cc_active
@@ -213,10 +213,12 @@ FINGERPRINTS.update({
CAR.CHEVROLET_SUBURBAN: FINGERPRINTS[CAR.CHEVROLET_SUBURBAN_CC],
CAR.GMC_YUKON_CC: FINGERPRINTS[CAR.GMC_YUKON],
CAR.CADILLAC_XT6: FINGERPRINTS[CAR.CHEVROLET_TRAVERSE],
CAR.CADILLAC_XT5: FINGERPRINTS[CAR.CHEVROLET_TRAVERSE],
CAR.CHEVROLET_BLAZER: FINGERPRINTS[CAR.CHEVROLET_TRAVERSE],
CAR.CHEVROLET_MALIBU_SDGM: FINGERPRINTS[CAR.CHEVROLET_MALIBU_CC],
CAR.BUICK_BABYENCLAVE: FINGERPRINTS[CAR.CHEVROLET_TRAVERSE],
CAR.CHEVROLET_SILVERADO_CC: FINGERPRINTS[CAR.CHEVROLET_SILVERADO],
CAR.BUICK_LACROSSE_ASCM: FINGERPRINTS[CAR.BUICK_LACROSSE],
})
FW_VERSIONS: dict[str, dict[tuple, list[bytes]]] = {
+2 -2
View File
@@ -410,8 +410,8 @@ class CarInterface(CarInterfaceBase):
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 in (CAR.BUICK_LACROSSE, CAR.BUICK_LACROSSE_ASCM):
CarInterfaceBase.configure_torque_tune(CAR.BUICK_LACROSSE, ret.lateralTuning)
elif candidate == CAR.CADILLAC_ESCALADE:
ret.minEnableSpeed = -1. # engage speed is decided by pcm
@@ -0,0 +1,387 @@
import sys
import types
from types import SimpleNamespace
fake_interfaces = types.ModuleType("opendbc.car.interfaces")
class _FakeCarControllerBase:
def __init__(self, dbc_names=None, CP=None):
self.CP = CP
fake_interfaces.CarControllerBase = _FakeCarControllerBase
sys.modules.setdefault("opendbc.car.interfaces", fake_interfaces)
fake_params = types.ModuleType("openpilot.common.params")
class _FakeParams:
pass
class _FakeUnknownKeyName(Exception):
pass
fake_params.Params = _FakeParams
fake_params.UnknownKeyName = _FakeUnknownKeyName
sys.modules.setdefault("openpilot.common.params", fake_params)
fake_testing_grounds = types.ModuleType("openpilot.starpilot.common.testing_grounds")
fake_testing_grounds.testing_ground = SimpleNamespace(use_1=False)
sys.modules.setdefault("openpilot.starpilot.common.testing_grounds", fake_testing_grounds)
from opendbc.car.gm.carcontroller import (
CarController,
estimate_auto_hold_brake,
get_adas_keepalive_step,
get_lka_steering_cmd_counter,
get_testing_ground_1_brake_switch_bias,
get_stock_cc_active_for_cancel,
should_activate_auto_hold,
should_send_stock_long_cancel,
should_spoof_dash_speed,
should_spoof_ecm_cruise_status,
supports_volt_auto_hold,
use_interceptor_sng_launch,
)
from opendbc.car.gm.values import AccState, CAR, GMFlags
from opendbc.car.structs import CarParams
def _cs(enabled, pcm_acc_status):
return SimpleNamespace(
out=SimpleNamespace(cruiseState=SimpleNamespace(enabled=enabled), accFaulted=False),
pcm_acc_status=pcm_acc_status,
)
def _sng_cs(v_ego, standstill, cruise_standstill):
return SimpleNamespace(
out=SimpleNamespace(
vEgo=v_ego,
standstill=standstill,
cruiseState=SimpleNamespace(standstill=cruise_standstill),
),
)
def _controller(car_fingerprint=CAR.CHEVROLET_BOLT_CC_2018_2021):
controller = CarController.__new__(CarController)
controller.CP = SimpleNamespace(carFingerprint=car_fingerprint)
controller.planner_regen_hold = False
controller.regen_paddle_pressed = False
controller.regen_paddle_timer = 0
controller.regen_press_counter = 0
controller.regen_release_counter = 0
controller.regen_min_on_frames = 0
controller.regen_min_off_frames = 0
controller.pedal_active_last = False
controller.pedal_steady = 0.0
controller.aego = 0.0
controller.maneuver_paddle_mode = "auto"
return controller
def test_gen1_bolt_pedal_cancel_uses_pcm_acc_status():
CP = SimpleNamespace(carFingerprint=CAR.CHEVROLET_BOLT_CC_2018_2021)
assert get_stock_cc_active_for_cancel(CP, _cs(False, AccState.ACTIVE))
def test_gen2_bolt_acc_pedal_cancel_uses_enabled_only():
CP = SimpleNamespace(carFingerprint=CAR.CHEVROLET_BOLT_ACC_2022_2023_PEDAL)
assert not get_stock_cc_active_for_cancel(CP, _cs(False, AccState.ACTIVE))
def test_stock_cancel_is_suppressed_when_acc_is_faulted():
CP = SimpleNamespace(carFingerprint=CAR.CHEVROLET_VOLT_CAMERA)
cs = _cs(True, AccState.FAULTED)
cs.out.accFaulted = True
assert not get_stock_cc_active_for_cancel(CP, cs)
assert not should_send_stock_long_cancel(11, cs)
def test_stock_cancel_requires_delay_and_no_acc_fault():
cs = _cs(True, AccState.ACTIVE)
assert not should_send_stock_long_cancel(10, cs)
assert should_send_stock_long_cancel(11, cs)
def test_gen1_bolt_pedal_ecm_cruise_spoof_is_not_gated_by_dash_speed_toggle():
CP = SimpleNamespace(
carFingerprint=CAR.CHEVROLET_BOLT_CC_2018_2021,
enableGasInterceptorDEPRECATED=True,
flags=GMFlags.PEDAL_LONG.value,
openpilotLongitudinalControl=True,
)
assert not should_spoof_dash_speed(CP, SimpleNamespace(disable_openpilot_long=True, gm_pedal_longitudinal=True))
assert should_spoof_ecm_cruise_status(CP)
def test_gateway_keepalive_uses_gateway_cadence():
cp = SimpleNamespace(networkLocation=CarParams.NetworkLocation.gateway, flags=0)
assert get_adas_keepalive_step(cp, is_kaofui_car=True) == 100
assert get_adas_keepalive_step(cp, is_kaofui_car=False) == 200
def test_removed_camera_keepalive_uses_camera_cadence():
cp = SimpleNamespace(networkLocation=CarParams.NetworkLocation.fwdCamera, flags=GMFlags.NO_CAMERA.value)
assert get_adas_keepalive_step(cp, is_kaofui_car=True) == 100
def test_live_camera_path_does_not_send_pt_keepalive():
cp = SimpleNamespace(networkLocation=CarParams.NetworkLocation.fwdCamera, flags=0)
assert get_adas_keepalive_step(cp, is_kaofui_car=True) is None
def test_volt_auto_hold_requires_toggle_supported_non_cc_only_volt_and_stock_safety():
stock_safety = [SimpleNamespace(safetyParam=0x8000)]
no_safety = [SimpleNamespace(safetyParam=0)]
assert supports_volt_auto_hold(
SimpleNamespace(
carFingerprint=CAR.CHEVROLET_VOLT_CAMERA,
openpilotLongitudinalControl=True,
networkLocation=CarParams.NetworkLocation.fwdCamera,
safetyConfigs=no_safety,
),
True,
)
assert not supports_volt_auto_hold(
SimpleNamespace(
carFingerprint=CAR.CHEVROLET_VOLT_CC,
openpilotLongitudinalControl=True,
networkLocation=CarParams.NetworkLocation.fwdCamera,
safetyConfigs=no_safety,
),
True,
)
assert supports_volt_auto_hold(
SimpleNamespace(
carFingerprint=CAR.CHEVROLET_VOLT,
openpilotLongitudinalControl=False,
networkLocation=CarParams.NetworkLocation.gateway,
safetyConfigs=stock_safety,
),
True,
)
assert supports_volt_auto_hold(
SimpleNamespace(
carFingerprint=CAR.CHEVROLET_VOLT_2019,
openpilotLongitudinalControl=False,
networkLocation=CarParams.NetworkLocation.fwdCamera,
safetyConfigs=stock_safety,
),
True,
)
assert not supports_volt_auto_hold(
SimpleNamespace(
carFingerprint=CAR.CHEVROLET_VOLT_2019,
openpilotLongitudinalControl=False,
networkLocation=CarParams.NetworkLocation.fwdCamera,
safetyConfigs=no_safety,
),
True,
)
assert not supports_volt_auto_hold(
SimpleNamespace(
carFingerprint=CAR.CHEVROLET_VOLT_CAMERA,
openpilotLongitudinalControl=True,
networkLocation=CarParams.NetworkLocation.fwdCamera,
safetyConfigs=no_safety,
),
False,
)
def test_auto_hold_brake_estimate_uses_driver_or_op_brake_and_clamps():
assert estimate_auto_hold_brake(0.0, 20.0) == 80
assert estimate_auto_hold_brake(20.0, 40.0) == 110
assert estimate_auto_hold_brake(20.0, 160.0) == 160
assert estimate_auto_hold_brake(100.0, 400.0) == 240
def test_auto_hold_activation_allows_direct_entry_from_stopped_brake_press():
assert should_activate_auto_hold(
True,
False,
False,
True,
True,
False,
False,
0.01,
)
def test_auto_hold_activation_stays_latched_after_brake_release():
assert should_activate_auto_hold(
True,
False,
True,
False,
True,
False,
False,
0.0,
)
def test_auto_hold_activation_blocks_when_long_is_active_or_motion_is_above_threshold():
assert not should_activate_auto_hold(
True,
True,
False,
True,
True,
True,
False,
0.0,
)
assert not should_activate_auto_hold(
True,
True,
False,
False,
False,
False,
0.03,
)
def test_auto_hold_activation_allows_standstill_even_if_speed_filter_is_slightly_above_threshold():
assert should_activate_auto_hold(
True,
True,
False,
False,
True,
False,
False,
0.05,
)
def test_calc_pedal_command_small_accel_deadband_keeps_creep_target_stable():
pos_controller = _controller()
neg_controller = _controller()
pos_pedal, pos_regen = pos_controller.calc_pedal_command(0.02, True, 0.3)
neg_pedal, neg_regen = neg_controller.calc_pedal_command(-0.02, True, 0.3)
assert not pos_regen
assert not neg_regen
assert pos_pedal == neg_pedal
def test_calc_pedal_command_creep_switch_does_not_snap_to_target():
controller = _controller()
controller.pedal_active_last = True
controller.pedal_steady = 0.18
controller.regen_press_counter = 20
pedal_gas, press_regen = controller.calc_pedal_command(-1.0, True, 0.5)
assert press_regen
assert pedal_gas > 0.15
def test_calc_pedal_command_softens_small_positive_follow_ramp_at_road_speed():
controller = _controller()
controller.pedal_active_last = True
controller.pedal_steady = 0.18
pedal_gas, press_regen = controller.calc_pedal_command(0.2, True, 18.0)
assert not press_regen
assert pedal_gas - 0.18 < 0.026
def test_calc_pedal_command_keeps_strong_positive_requests_responsive():
controller = _controller()
controller.pedal_active_last = True
controller.pedal_steady = 0.18
pedal_gas, press_regen = controller.calc_pedal_command(1.4, True, 18.0)
assert not press_regen
assert pedal_gas - 0.18 > 0.04
def test_use_interceptor_sng_launch_requires_actual_near_stop():
CP = SimpleNamespace(vEgoStarting=0.25)
assert use_interceptor_sng_launch(CP, _sng_cs(0.0, True, True))
assert use_interceptor_sng_launch(CP, _sng_cs(0.2, False, True))
assert not use_interceptor_sng_launch(CP, _sng_cs(1.2, False, True))
assert not use_interceptor_sng_launch(CP, _sng_cs(0.0, True, False))
def test_use_interceptor_sng_launch_extends_for_maneuver_mode():
CP = SimpleNamespace(vEgoStarting=0.25)
assert use_interceptor_sng_launch(CP, _sng_cs(1.2, False, True), maneuver_mode=True)
assert not use_interceptor_sng_launch(CP, _sng_cs(2.2, False, True), maneuver_mode=True)
def test_testing_ground_1_brake_switch_bias_is_softened_but_still_speed_scaled():
assert get_testing_ground_1_brake_switch_bias(0.0) == 40
assert get_testing_ground_1_brake_switch_bias(6.0) == 85
assert get_testing_ground_1_brake_switch_bias(15.0) == 130
assert get_testing_ground_1_brake_switch_bias(30.0) == 170
def test_lka_counter_uses_returned_loopback_counter():
cs = SimpleNamespace(
loopback_lka_steering_cmd_updated=True,
loopback_lka_steering_cmd_counter=2,
loopback_lka_steering_cmd_ts_nanos=1,
pt_lka_steering_cmd_counter=0,
)
assert get_lka_steering_cmd_counter(0, cs) == 3
def test_lka_counter_keeps_advancing_without_loopback_updates():
cs = SimpleNamespace(
loopback_lka_steering_cmd_updated=False,
loopback_lka_steering_cmd_counter=0,
loopback_lka_steering_cmd_ts_nanos=1,
pt_lka_steering_cmd_counter=0,
)
next_counter = 1
sent = []
for _ in range(6):
idx = get_lka_steering_cmd_counter(next_counter, cs)
sent.append(idx)
next_counter = (idx + 1) % 4
assert sent == [1, 2, 3, 0, 1, 2]
def test_lka_counter_only_seeds_from_pt_counter_once_without_loopback():
cs = SimpleNamespace(
loopback_lka_steering_cmd_updated=False,
loopback_lka_steering_cmd_counter=0,
loopback_lka_steering_cmd_ts_nanos=0,
pt_lka_steering_cmd_counter=0,
)
next_counter = -1
sent = []
for _ in range(6):
idx = get_lka_steering_cmd_counter(next_counter, cs)
sent.append(idx)
next_counter = (idx + 1) % 4
assert sent == [1, 2, 3, 0, 1, 2]
@@ -0,0 +1,52 @@
from opendbc.can import CANPacker
from opendbc.car.gm import gmcan
from opendbc.car.gm.values import CAR, DBC
class TestGMCan:
def setup_method(self):
self.packer = CANPacker(DBC[CAR.CHEVROLET_BOLT_ACC_2022_2023]["pt"])
def test_gas_regen_command_matches_starpilot_bolt_acc(self):
addr, dat, bus = gmcan.create_gas_regen_command(self.packer, 0, 5000, 1, True, False)
assert addr == 0x2CB
assert bus == 0
assert dat.hex() == "41429c4000bd63bf"
def test_gas_regen_command_preserves_always_one3_layout(self):
_, dat, _ = gmcan.create_gas_regen_command(self.packer, 0, 0, 1, True, False, include_always_one3=True)
assert dat.hex() == "4142800000bd7fff"
def test_gas_regen_command_encodes_high_bit_above_8191(self):
_, dat, _ = gmcan.create_gas_regen_command(self.packer, 0, 8848, 1, True, False)
decoded = ((dat[1] & 0x1) << 13) | (dat[2] << 5) | ((dat[3] & 0xF8) >> 3)
assert dat[1] & 0x1
assert decoded == 8848
def test_gas_regen_command_matches_starpilot_volt_2019(self):
packer = CANPacker(DBC[CAR.CHEVROLET_VOLT_2019]["pt"])
addr, dat, bus = gmcan.create_gas_regen_command(packer, 0, 5000, 1, True, False, include_always_one3=True, use_volt_layout=True)
assert addr == 0x2CB
assert bus == 0
assert dat.hex() == "41429c4000bd63bf"
def test_gas_regen_command_matches_starpilot_volt_ascm(self):
packer = CANPacker(DBC[CAR.CHEVROLET_VOLT_ASCM]["pt"])
addr, dat, bus = gmcan.create_gas_regen_command(packer, 0, 5000, 1, True, False, include_always_one3=True, use_volt_layout=True)
assert addr == 0x2CB
assert bus == 0
assert dat.hex() == "41429c4000bd63bf"
def test_gas_regen_command_matches_opgm_plain_volt_layout(self):
packer = CANPacker("gm_global_a_powertrain_generated")
addr, dat, bus = gmcan.create_gas_regen_command(packer, 0, 5000, 1, True, False, use_generated_layout=True)
assert addr == 0x2CB
assert bus == 0
assert dat.hex() == "41435c7000bca38f"
+5 -1
View File
@@ -279,6 +279,10 @@ class CAR(Platforms):
[GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")],
GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4),
)
BUICK_LACROSSE_ASCM = GMPlatformConfig(
[GMCarDocs("Buick LaCrosse 2017-19 ASCM Harness")],
BUICK_LACROSSE.specs,
)
BUICK_REGAL = GMASCMPlatformConfig(
[GMCarDocs("Buick Regal Essence 2018")],
GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4),
@@ -572,7 +576,7 @@ CC_REGEN_PADDLE_CAR = {
CAMERA_ACC_CAR.update(CC_ONLY_CAR)
# ASCM-INT paths are only enabled when SASCM (0x2FF) is detected at runtime
ASCM_INT = {CAR.CHEVROLET_VOLT_ASCM, CAR.GMC_ACADIA_ASCM, CAR.CHEVROLET_MALIBU_ASCM, CAR.CADILLAC_ESCALADE_ASCM}
ASCM_INT = {CAR.CHEVROLET_VOLT_ASCM, CAR.GMC_ACADIA_ASCM, CAR.CHEVROLET_MALIBU_ASCM, CAR.CADILLAC_ESCALADE_ASCM, CAR.BUICK_LACROSSE_ASCM}
STEER_THRESHOLD = 1.0
@@ -297,6 +297,7 @@ class CarController(CarControllerBase):
copies_xp = REDNECK_BUTTON_COPIES_TIME_METRIC if CS.is_metric else REDNECK_BUTTON_COPIES_TIME_IMPERIAL
copies = int(np.interp(REDNECK_BUTTON_COPIES_TIME, copies_xp, [1, REDNECK_BUTTON_COPIES]))
can_sends = [hyundaican.create_clu11(self.packer, self.frame, CS.clu11, send_button, self.CP)] * copies
CS.redneck_last_sent_button = getattr(CS, "redneck_send_button", 0)
if (self.frame - self.last_button_frame) * DT_CTRL >= 0.15:
self.last_button_frame = self.frame
@@ -318,6 +319,7 @@ class CarController(CarControllerBase):
hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, (CS.buttons_counter + button_counter_offset) % 0xF, send_button)
for _ in range(20)
]
CS.redneck_last_sent_button = getattr(CS, "redneck_send_button", 0)
self.last_button_frame = self.frame
return can_sends
@@ -376,6 +378,7 @@ class CarController(CarControllerBase):
accel = accel_cmd
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)
CS.redneck_last_sent_button = 0
can_sends = []
+53 -6
View File
@@ -8,7 +8,7 @@ from opendbc.car import Bus, create_button_events, structs
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.hyundai.hyundaicanfd import CanBus
from opendbc.car.hyundai.values import HyundaiFlags, HyundaiStarPilotFlags, HyundaiStarPilotSafetyFlags, CAR, DBC, Buttons, CarControllerParams, \
hyundai_cancel_button_enables_cruise
hyundai_cancel_button_enables_cruise, ALT_BUS_LDA_BUTTON_CARS, ALT_BUS_LDA_BUTTON_SWL_STAT_CARS
from opendbc.car.interfaces import CarStateBase
ButtonType = structs.CarState.ButtonEvent.Type
@@ -25,6 +25,7 @@ BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: Bu
IONIQ_6_BLINDSPOT_RIGHT_MASK = 0x08
IONIQ_6_BLINDSPOT_LEFT_MASK = 0x10
CANFD_CAMERA_LEAD_MIN_DISTANCE = 0.1
ALT_BUS_LDA_BUTTON_BURST_DEBOUNCE_NS = int(1.3e9)
def get_non_scc_cruise_signals(CP) -> tuple[str, str, str, str, str, str]:
@@ -74,6 +75,8 @@ class CarState(CarStateBase):
self.cruise_buttons: deque = deque([Buttons.NONE] * PREV_BUTTON_SAMPLES, maxlen=PREV_BUTTON_SAMPLES)
self.main_buttons: deque = deque([Buttons.NONE] * PREV_BUTTON_SAMPLES, maxlen=PREV_BUTTON_SAMPLES)
self.lda_button = 0
self.lda_button_raw = 0
self.lda_button_last_raw_rise_ts_nanos = 0
self.left_paddle = 0
self.mode_button = 0
self.custom_button = 0
@@ -171,9 +174,44 @@ class CarState(CarStateBase):
return False
def create_alt_bus_lda_button_events(self, cp_source: CANParser) -> list[structs.CarState.ButtonEvent]:
if self.CP.carFingerprint in ALT_BUS_LDA_BUTTON_SWL_STAT_CARS:
raw_lda_button = int(cp_source.vl["CLU13"]["CF_Clu_SWL_Stat"] == 4)
raw_lda_button_ts_nanos = cp_source.ts_nanos["CLU13"]["CF_Clu_SWL_Stat"]
else:
raw_lda_button = int(cp_source.vl["CLU13"]["CF_Clu_LdwsLkasSW"])
raw_lda_button_ts_nanos = cp_source.ts_nanos["CLU13"]["CF_Clu_LdwsLkasSW"]
button_events: list[structs.CarState.ButtonEvent] = []
# Some alt-bus LKAS button layouts pulse several times per physical press burst.
# Collapse each burst into a single synthetic press/release pair.
if raw_lda_button and not self.lda_button_raw:
if self.lda_button_last_raw_rise_ts_nanos == 0 or \
raw_lda_button_ts_nanos - self.lda_button_last_raw_rise_ts_nanos > ALT_BUS_LDA_BUTTON_BURST_DEBOUNCE_NS:
button_events = [
structs.CarState.ButtonEvent(pressed=True, type=ButtonType.lkas),
structs.CarState.ButtonEvent(pressed=False, type=ButtonType.lkas),
]
self.lda_button_last_raw_rise_ts_nanos = raw_lda_button_ts_nanos
self.lda_button_raw = raw_lda_button
return button_events
def create_lkas_button_events(self, cp: CANParser, prev_lda_button: int) -> list[structs.CarState.ButtonEvent]:
# Some classic HKG platforms publish the LKAS button on the cluster bus instead of BCM_PO_11.
if cp.ts_nanos["CLU13"]["CF_Clu_LdwsLkasSW"] > 0:
self.lda_button = int(cp.vl["CLU13"]["CF_Clu_LdwsLkasSW"])
elif cp.ts_nanos["BCM_PO_11"]["LDA_BTN"] > 0:
self.lda_button = int(cp.vl["BCM_PO_11"]["LDA_BTN"])
else:
self.lda_button = 0
return create_button_events(self.lda_button, prev_lda_button, {1: ButtonType.lkas})
def update(self, can_parsers, starpilot_toggles) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
cp_alt = can_parsers.get(Bus.alt)
if self.CP.flags & HyundaiFlags.CANFD:
return self.update_canfd(can_parsers)
@@ -307,14 +345,17 @@ class CarState(CarStateBase):
prev_cruise_buttons = self.cruise_buttons[-1]
prev_main_buttons = self.main_buttons[-1]
prev_lda_button = self.lda_button
lkas_button_events = []
self.cruise_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"])
self.main_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwMain"])
if self.FPCP.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON:
self.lda_button = cp.vl["BCM_PO_11"]["LDA_BTN"]
if self.CP.carFingerprint in ALT_BUS_LDA_BUTTON_CARS and cp_alt is not None and cp_alt.ts_nanos["CLU13"]["CF_Clu_LdwsLkasSW"] > 0:
lkas_button_events = self.create_alt_bus_lda_button_events(cp_alt)
else:
lkas_button_events = self.create_lkas_button_events(cp, prev_lda_button)
ret.buttonEvents = [*self.create_cruise_button_events(self.cruise_buttons[-1], prev_cruise_buttons),
*create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise}),
*create_button_events(self.lda_button, prev_lda_button, {1: ButtonType.lkas})]
*lkas_button_events]
ret.blockPcmEnable = not self.recent_button_interaction()
@@ -525,11 +566,17 @@ class CarState(CarStateBase):
if CP.flags & HyundaiFlags.CANFD:
return self.get_can_parsers_canfd(CP)
msgs = []
msgs = [
("BCM_PO_11", 0),
("CLU13", 0),
]
if CP.flags & HyundaiFlags.NON_SCC and not (CP.flags & HyundaiFlags.NON_SCC_NO_FCA):
msgs.append(("FCA11", 0)) # Non-SCC trims can stop publishing FCA11; don't let it poison canValid
return {
parsers = {
Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], msgs, 0),
Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
}
if CP.carFingerprint in ALT_BUS_LDA_BUTTON_CARS:
parsers[Bus.alt] = CANParser(DBC[CP.carFingerprint][Bus.pt], [("CLU13", 0)], 1)
return parsers
@@ -1536,12 +1536,18 @@ FW_VERSIONS = {
(Ecu.eps, 0x7d4, None): [
b'\xf1\x00OS MDPS C 1.00 1.05 56310J9030\x00 4OSDC105',
b'\xf1\x00OS MDPS C 1.00 1.04 56310J9030\x00 4OSDC104',
b'\xf1\x00OS MDPS C 1.00 1.05 56310/J9500 4OSDC105',
],
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00OS9 LKAS AT USA LHD 1.00 1.00 95740-J9200 g30',
b'\xf1\x00OS9 LKAS AT AUS RHD 1.00 1.00 95740-J9200 g30',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00OS__ FCA --CUP 1.00 1.00 95655-J9100 ',
],
(Ecu.transmission, 0x7e1, None): [
b'\xf1\x006T6J0_C2\x00\x006T6K1051\x00\x00TOS4N20NS2\x00\x00\x00\x00',
b'\xf1\x006U2V0_C2\x00\x006U2V1051\x00\x00DOS4T16AS2\x00\x00\x00\x00',
],
},
CAR.KIA_FORTE_2019_NON_SCC: {
@@ -24,6 +24,7 @@ ENABLE_BUTTONS = (ButtonType.accelCruise, ButtonType.decelCruise, ButtonType.can
# Track when ECU disable happened - used to permanently suppress CAN errors from disabled ECU
ECU_DISABLE_TIMESTAMP = 0.0
KONA_NON_SCC_FCA_RADAR_ADDR = 0x602
def apply_platform_longitudinal_params(ret: structs.CarParams) -> None:
@@ -45,6 +46,18 @@ def apply_ecu_disable_failure_fallback(CP: structs.CarParams, params) -> None:
CP.pcmCruise = True
def detect_kona_non_scc_radar_fca(candidate, fingerprint, car_fw) -> bool:
if candidate != CAR.HYUNDAI_KONA_NON_SCC:
return False
if any(fw.ecu == Ecu.fwdRadar for fw in car_fw):
return True
# Some non-SCC Kona trims have FCA radar tracks without SCC. Use PT FCA11
# status on those cars; camera-bus FCA11 is not continuously published.
return KONA_NON_SCC_FCA_RADAR_ADDR in fingerprint[1]
class CarInterface(CarInterfaceBase):
CarState = CarState
CarController = CarController
@@ -136,6 +149,8 @@ class CarInterface(CarInterfaceBase):
# These cars use the FCA11 message for the AEB and FCW signals, all others use SCC12
if 0x38d in fingerprint[CAN.ECAN] or 0x38d in fingerprint[CAN.CAM]:
ret.flags |= HyundaiFlags.USE_FCA.value
if detect_kona_non_scc_radar_fca(candidate, fingerprint, car_fw):
ret.flags |= HyundaiFlags.NON_SCC_RADAR_FCA.value
if ret.flags & HyundaiFlags.LEGACY:
# these cars require a special panda safety mode due to missing counters and checksums in the messages
@@ -199,6 +214,8 @@ class CarInterface(CarInterfaceBase):
# Car specific configuration overrides
if candidate == CAR.GENESIS_G90:
ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON.value
ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE.value
ret.stoppingDecelRate = 0.55
ret.vEgoStopping = 0.8
@@ -2,14 +2,19 @@ import math
from dataclasses import dataclass
from opendbc.can import CANParser
from opendbc.can.dbc import DBC as DBCReader
from opendbc.can.parser import get_raw_value
from opendbc.car import Bus, structs
from opendbc.car.interfaces import RadarInterfaceBase
from opendbc.car.hyundai.values import CAR, DBC, HYUNDAI_MANDO_FRONT_RADAR_DBC, HYUNDAI_MRR30_RADAR_DBC, \
HYUNDAI_MRR35_RADAR_DBC
from opendbc.car.hyundai.values import CAR, DBC, HYUNDAI_MANDO_FRONT_RADAR_DBC, HYUNDAI_MRREVO14F_RADAR_DBC, \
HYUNDAI_MRR30_RADAR_DBC, HYUNDAI_MRR35_RADAR_DBC
from openpilot.common.swaglog import cloudlog
RADAR_START_ADDR = 0x500
RADAR_MSG_COUNT = 32
G90_RADAR_MSG_COUNT = 64
MRREVO14F_RADAR_START_ADDR = 0x602
MRREVO14F_RADAR_MSG_COUNT = 16
MRR30_RADAR_START_ADDR = 0x210
MRR30_RADAR_MSG_COUNT = 16
MRR35_RADAR_START_ADDR = 0x3A5
@@ -23,11 +28,17 @@ class RadarTrackConfig:
radar_type: str
bus: int = 1
frequency: int = 50
parser_msg_count: int | None = None
@property
def can_parser_msg_count(self) -> int:
return self.parser_msg_count if self.parser_msg_count is not None else self.msg_count
RADAR_TRACK_CONFIGS = {
HYUNDAI_MANDO_FRONT_RADAR_DBC: RadarTrackConfig(RADAR_START_ADDR, RADAR_MSG_COUNT, "mando"),
HYUNDAI_MRR30_RADAR_DBC: RadarTrackConfig(MRR30_RADAR_START_ADDR, MRR30_RADAR_MSG_COUNT, "mrr30"),
HYUNDAI_MRREVO14F_RADAR_DBC: RadarTrackConfig(MRREVO14F_RADAR_START_ADDR, MRREVO14F_RADAR_MSG_COUNT, "mrrevo14f"),
HYUNDAI_MRR30_RADAR_DBC: RadarTrackConfig(MRR30_RADAR_START_ADDR, MRR30_RADAR_MSG_COUNT, "mrr30", bus=0),
HYUNDAI_MRR35_RADAR_DBC: RadarTrackConfig(MRR35_RADAR_START_ADDR, MRR35_RADAR_MSG_COUNT, "mrr35", bus=0, frequency=20),
}
@@ -36,6 +47,8 @@ RADAR_TRACK_CONFIGS = {
def get_radar_track_config(car_fingerprint) -> RadarTrackConfig | None:
radar_dbc = DBC[car_fingerprint].get(Bus.radar)
if car_fingerprint == CAR.GENESIS_G90 and radar_dbc == HYUNDAI_MANDO_FRONT_RADAR_DBC:
return RadarTrackConfig(RADAR_START_ADDR, G90_RADAR_MSG_COUNT, "mando", parser_msg_count=RADAR_MSG_COUNT)
return RADAR_TRACK_CONFIGS.get(radar_dbc)
@@ -43,7 +56,8 @@ def get_radar_can_parser(CP, radar_config):
if radar_config is None:
return None
messages = [(f"RADAR_TRACK_{addr:x}", radar_config.frequency) for addr in range(radar_config.start_addr, radar_config.start_addr + radar_config.msg_count)]
messages = [(f"RADAR_TRACK_{addr:x}", radar_config.frequency)
for addr in range(radar_config.start_addr, radar_config.start_addr + radar_config.can_parser_msg_count)]
return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, radar_config.bus)
@@ -52,8 +66,15 @@ class RadarInterface(RadarInterfaceBase):
super().__init__(CP)
self.radar_config = get_radar_track_config(CP.carFingerprint)
self.updated_messages = set()
self.trigger_msg = (self.radar_config.start_addr + self.radar_config.msg_count - 1) if self.radar_config is not None else RADAR_START_ADDR
self.trigger_msg = (self.radar_config.start_addr + self.radar_config.can_parser_msg_count - 1
if self.radar_config is not None else RADAR_START_ADDR)
self.track_id = 0
self.g90_extended_mando = (CP.carFingerprint == CAR.GENESIS_G90 and self.radar_config is not None and
self.radar_config.msg_count > self.radar_config.can_parser_msg_count)
self.g90_mando_signals = []
if self.g90_extended_mando:
radar_dbc = DBCReader(DBC[CP.carFingerprint][Bus.radar])
self.g90_mando_signals = list(radar_dbc.addr_to_msg[RADAR_START_ADDR].sigs.values())
self.radar_off_can = CP.radarUnavailable
# Probe whether radar tracks still exist on the Ioniq 6 while OP long is active,
@@ -70,7 +91,7 @@ class RadarInterface(RadarInterfaceBase):
if self.radar_config is not None:
self.track_addrs = [(addr, f"RADAR_TRACK_{addr:x}")
for addr in range(self.radar_config.start_addr,
self.radar_config.start_addr + self.radar_config.msg_count)]
self.radar_config.start_addr + self.radar_config.can_parser_msg_count)]
def update(self, can_strings):
if self.ioniq_6_radar_probe and self.rcp is not None and not self.ioniq_6_radar_probe_logged:
@@ -93,6 +114,8 @@ class RadarInterface(RadarInterfaceBase):
vls = self.rcp.update(can_strings)
self.updated_messages.update(vls)
if self.g90_extended_mando:
self._update_g90_extended_mando_tracks(can_strings)
if self.trigger_msg not in self.updated_messages:
return None
@@ -102,6 +125,46 @@ class RadarInterface(RadarInterfaceBase):
return rr
def _decode_g90_mando_values(self, dat: bytes):
vals = {}
for sig in self.g90_mando_signals:
raw = get_raw_value(dat, sig)
if sig.is_signed:
raw -= ((raw >> (sig.size - 1)) & 1) * (1 << sig.size)
vals[sig.name] = raw * sig.factor + sig.offset
return vals
def _update_g90_extended_mando_tracks(self, can_strings):
if self.radar_config is None:
return
start_addr = self.radar_config.start_addr + self.radar_config.can_parser_msg_count
end_addr = self.radar_config.start_addr + self.radar_config.msg_count
for _, frames in can_strings:
for address, dat, src in frames:
if src != self.radar_config.bus or not (start_addr <= address < end_addr) or len(dat) < 8:
continue
self.updated_messages.add(address)
msg = self._decode_g90_mando_values(dat)
valid = msg["STATE"] in (3, 4)
if valid:
if address not in self.pts:
self.pts[address] = structs.RadarData.RadarPoint()
self.pts[address].trackId = self.track_id
self.track_id += 1
azimuth = math.radians(msg["AZIMUTH"])
self.pts[address].measured = True
self.pts[address].dRel = math.cos(azimuth) * msg["LONG_DIST"]
self.pts[address].yRel = 0.5 * -math.sin(azimuth) * msg["LONG_DIST"]
self.pts[address].vRel = msg["REL_SPEED"]
self.pts[address].aRel = msg["REL_ACCEL"]
self.pts[address].yvRel = float("nan")
elif address in self.pts:
del self.pts[address]
def _update(self, updated_messages):
ret = structs.RadarData()
if self.rcp is None:
@@ -140,6 +203,27 @@ class RadarInterface(RadarInterfaceBase):
del self.pts[track_key]
continue
if radar_type == "mrrevo14f":
for i in ("1", "2"):
track_key = addr * 2 + int(i) - 1
valid = msg[f"{i}_DISTANCE"] != 255.75
if valid:
pt = self.pts.get(track_key)
if pt is None:
pt = structs.RadarData.RadarPoint()
pt.trackId = self.track_id
self.track_id += 1
self.pts[track_key] = pt
pt.measured = True
pt.dRel = msg[f"{i}_DISTANCE"]
pt.yRel = msg[f"{i}_LATERAL"]
pt.vRel = msg[f"{i}_SPEED"]
pt.aRel = float("nan")
pt.yvRel = float("nan")
elif track_key in self.pts:
del self.pts[track_key]
continue
if radar_type == "mrr35":
# Most of the 32 channels are empty each frame. Only allocate a point
# when the channel is valid; drop it otherwise. Avoids the per-frame
@@ -14,12 +14,13 @@ from opendbc.car.hyundai.carstate import CarState, decode_canfd_camera_lead, dec
from opendbc.car.hyundai.interface import CarInterface
from opendbc.car.hyundai import hyundaican, hyundaicanfd
from opendbc.car.hyundai.hyundaicanfd import CanBus
from opendbc.car.hyundai.radar_interface import MRR30_RADAR_START_ADDR, MRR35_RADAR_START_ADDR, RADAR_START_ADDR, get_radar_track_config
from opendbc.car.hyundai.radar_interface import MRREVO14F_RADAR_START_ADDR, MRR30_RADAR_START_ADDR, MRR35_RADAR_START_ADDR, \
RADAR_START_ADDR, get_radar_track_config
from opendbc.car.hyundai.values import CAMERA_SCC_CAR, CANFD_CAR, CAN_GEARS, CAR, CHECKSUM, DATE_FW_ECUS, \
HYBRID_CAR, EV_CAR, FW_QUERY_CONFIG, LEGACY_SAFETY_MODE_CAR, CANFD_FUZZY_WHITELIST, \
UNSUPPORTED_LONGITUDINAL_CAR, PLATFORM_CODE_ECUS, HYUNDAI_VERSION_REQUEST_LONG, \
CarControllerParams, DBC, HyundaiFlags, get_platform_codes, HyundaiSafetyFlags, \
HyundaiStarPilotSafetyFlags, Buttons
HyundaiStarPilotSafetyFlags, Buttons, GENESIS_G90_STEER_MAX, HYUNDAI_PALISADE_2023_STEER_MAX
LongCtrlState = CarControl.Actuators.LongControlState
from opendbc.car.hyundai.fingerprints import FW_VERSIONS
@@ -120,7 +121,22 @@ class TestHyundaiFingerprint:
assert bool(CP.flags & HyundaiFlags.CANFD_LKA_STEERING) == lka_steering
# radar available
for candidate in (CAR.HYUNDAI_SONATA, CAR.GENESIS_G90):
for candidate in (
CAR.HYUNDAI_IONIQ,
CAR.HYUNDAI_IONIQ_EV_LTD,
CAR.HYUNDAI_SANTA_FE,
CAR.HYUNDAI_SANTA_FE_2022,
CAR.HYUNDAI_SANTA_FE_HEV_2022,
CAR.HYUNDAI_SANTA_FE_PHEV_2022,
CAR.HYUNDAI_SONATA,
CAR.HYUNDAI_SONATA_HYBRID,
CAR.KIA_K5_HEV_2020,
CAR.KIA_NIRO_EV,
CAR.KIA_NIRO_PHEV,
CAR.KIA_NIRO_PHEV_2022,
CAR.GENESIS_G70_2020,
CAR.GENESIS_G90,
):
assert get_radar_track_config(candidate).start_addr == RADAR_START_ADDR
for radar in (True, False):
fingerprint = gen_empty_fingerprint()
@@ -129,16 +145,24 @@ class TestHyundaiFingerprint:
CP = CarInterface.get_params(candidate, fingerprint, [], False, False, False, None)
assert CP.radarUnavailable != radar
assert get_radar_track_config(CAR.HYUNDAI_SONATA_HYBRID).msg_count == 32
assert get_radar_track_config(CAR.GENESIS_G90).msg_count == 64
assert get_radar_track_config(CAR.GENESIS_G90).can_parser_msg_count == 32
fingerprint = gen_empty_fingerprint()
fingerprint[1][RADAR_START_ADDR] = 8
CP = CarInterface.get_params(CAR.GENESIS_G90, fingerprint, [], True, False, False, None)
assert CP.openpilotLongitudinalControl
assert not CP.radarUnavailable
for candidate in (CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SONATA_HYBRID, CAR.GENESIS_G90):
CP = CarInterface.get_params(candidate, fingerprint, [], True, False, False, None)
assert CP.openpilotLongitudinalControl
assert not CP.radarUnavailable
for candidate, radar_addr in (
(CAR.HYUNDAI_KONA_EV_2022, MRREVO14F_RADAR_START_ADDR),
(CAR.HYUNDAI_IONIQ_5, MRR30_RADAR_START_ADDR),
(CAR.HYUNDAI_IONIQ_5_N, MRR30_RADAR_START_ADDR),
(CAR.KIA_EV6, MRR30_RADAR_START_ADDR),
(CAR.KIA_EV6_2025, MRR30_RADAR_START_ADDR),
(CAR.GENESIS_GV60_EV_1ST_GEN, MRR30_RADAR_START_ADDR),
(CAR.HYUNDAI_KONA_EV_2ND_GEN, MRR35_RADAR_START_ADDR),
(CAR.HYUNDAI_IONIQ_6, MRR35_RADAR_START_ADDR),
(CAR.HYUNDAI_IONIQ_9, MRR35_RADAR_START_ADDR),
@@ -152,6 +176,8 @@ class TestHyundaiFingerprint:
CP = CarInterface.get_params(candidate, fingerprint, [], False, False, False, None)
assert CP.radarUnavailable != radar
assert get_radar_track_config(CAR.HYUNDAI_KONA_EV_2022).bus == 1
assert get_radar_track_config(CAR.HYUNDAI_IONIQ_5).bus == 0
assert get_radar_track_config(CAR.HYUNDAI_IONIQ_6).start_addr == MRR35_RADAR_START_ADDR
fingerprint = gen_empty_fingerprint()
fingerprint[1][MRR35_RADAR_START_ADDR] = 24
@@ -245,6 +271,15 @@ class TestHyundaiFingerprint:
sonata = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False, None)
assert sonata.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON
fingerprint = gen_empty_fingerprint()
fingerprint[0][0x50C] = 8
forte_non_scc = CarInterface.get_params(CAR.KIA_FORTE_2021_NON_SCC, fingerprint, [], False, False, False, None)
assert forte_non_scc.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON
g90 = CarInterface.get_params(CAR.GENESIS_G90, gen_empty_fingerprint(), [], False, False, False, None)
assert g90.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON
assert g90.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE
sonata_without_lda = CarInterface.get_params(CAR.HYUNDAI_SONATA, gen_empty_fingerprint(), [], False, False, False, None)
assert not (sonata_without_lda.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON)
@@ -255,6 +290,21 @@ class TestHyundaiFingerprint:
elantra_hev = CarInterface.get_params(CAR.HYUNDAI_ELANTRA_HEV_2022_NON_SCC, gen_empty_fingerprint(), [], True, False, False, None)
assert elantra_hev.flags & HyundaiFlags.HYBRID
kona = CarInterface.get_params(CAR.HYUNDAI_KONA_NON_SCC, gen_empty_fingerprint(), [], True, False, False, None)
assert not (kona.flags & HyundaiFlags.NON_SCC_RADAR_FCA)
assert kona.radarUnavailable
fingerprint = gen_empty_fingerprint()
fingerprint[0][0x38d] = 8
fingerprint[1][MRREVO14F_RADAR_START_ADDR] = 8
kona_radar_fca = CarInterface.get_params(CAR.HYUNDAI_KONA_NON_SCC, fingerprint, [], True, False, False, None)
assert kona_radar_fca.flags & HyundaiFlags.NON_SCC_RADAR_FCA
assert not kona_radar_fca.radarUnavailable
car_fw = [CarParams.CarFw(ecu=Ecu.fwdRadar, fwVersion=b"", address=0x7d0, brand="hyundai")]
kona_radar_fw = CarInterface.get_params(CAR.HYUNDAI_KONA_NON_SCC, gen_empty_fingerprint(), car_fw, True, False, False, None)
assert kona_radar_fw.flags & HyundaiFlags.NON_SCC_RADAR_FCA
forte_2019 = CarInterface.get_params(CAR.KIA_FORTE_2019_NON_SCC, gen_empty_fingerprint(), [], True, False, False, None)
assert forte_2019.flags & HyundaiFlags.NON_SCC_NO_FCA
assert not (forte_2019.flags & HyundaiFlags.NON_SCC_RADAR_FCA)
@@ -310,6 +360,46 @@ class TestHyundaiFingerprint:
assert canfd_alt_buttons_cp.flags & HyundaiFlags.CANFD_ALT_BUTTONS
assert not canfd_alt_buttons_fpcp.redneckCruiseAvailable
def test_hyundai_full_long_keeps_redneck_cruise_disabled(self, monkeypatch):
class FakeParams:
def __init__(self, *args, **kwargs):
pass
@staticmethod
def get_bool(key):
return key == "RedneckCruise"
toggles = get_test_toggles()
monkeypatch.setattr("opendbc.car.interfaces.Params", FakeParams)
for candidate in (CAR.HYUNDAI_SONATA, CAR.KIA_FORTE):
CP = CarInterface.get_params(candidate, gen_empty_fingerprint(), [], True, False, False, toggles)
FPCP = CarInterface.get_starpilot_params(candidate, gen_empty_fingerprint(), [], CP, toggles)
assert CP.openpilotLongitudinalControl
assert not FPCP.redneckCruiseAvailable
assert FPCP.pcmCruiseSpeed
def test_hyundai_scc_stock_long_keeps_redneck_cruise_disabled(self, monkeypatch):
class FakeParams:
def __init__(self, *args, **kwargs):
pass
@staticmethod
def get_bool(key):
return key == "RedneckCruise"
toggles = get_test_toggles()
monkeypatch.setattr("opendbc.car.interfaces.Params", FakeParams)
for candidate in (CAR.HYUNDAI_SONATA, CAR.KIA_FORTE, CAR.HYUNDAI_IONIQ_6):
CP = CarInterface.get_params(candidate, gen_empty_fingerprint(), [], False, False, False, toggles)
FPCP = CarInterface.get_starpilot_params(candidate, gen_empty_fingerprint(), [], CP, toggles)
assert not CP.openpilotLongitudinalControl
assert not FPCP.redneckCruiseAvailable
assert FPCP.pcmCruiseSpeed
def test_palisade_2023_pause_resume_button_maps_to_enable(self):
toggles = get_test_toggles()
CP = CarInterface.get_params(CAR.HYUNDAI_PALISADE_2023, gen_empty_fingerprint(), [], True, False, False, toggles)
@@ -413,6 +503,24 @@ class TestHyundaiFingerprint:
def test_kona_ev_non_scc_has_no_dedicated_fw_coverage(self):
assert CAR.HYUNDAI_KONA_EV_NON_SCC not in FW_VERSIONS
def test_kona_non_scc_fca_radar_fw_is_optional(self):
fw_versions = FW_VERSIONS[CAR.HYUNDAI_KONA_NON_SCC]
car_fw = [
CarParams.CarFw(
ecu=ecu,
fwVersion=versions[0],
address=address,
subAddress=0 if sub_address is None else sub_address,
brand="hyundai",
)
for (ecu, address, sub_address), versions in fw_versions.items()
if ecu != Ecu.fwdRadar
]
exact, matches = match_fw_to_car(car_fw, "", allow_exact=True, allow_fuzzy=False, log=False)
assert exact
assert CAR.HYUNDAI_KONA_NON_SCC in matches
def test_kia_forte_2019_non_scc_does_not_require_fca11_or_scc12(self):
toggles = get_test_toggles()
CP = CarInterface.get_params(CAR.KIA_FORTE_2019_NON_SCC, gen_empty_fingerprint(), [], True, False, False, toggles)
@@ -530,6 +638,78 @@ class TestHyundaiFingerprint:
ret = update(0, 3)
assert any(be.type == ButtonType.altButton2 and not be.pressed for be in ret.buttonEvents)
def test_forte_non_scc_clu13_lkas_button_event(self):
toggles = get_test_toggles()
fingerprint = gen_empty_fingerprint()
fingerprint[0][0x50C] = 8
CP = CarInterface.get_params(CAR.KIA_FORTE_2021_NON_SCC, fingerprint, [], False, False, False, toggles)
FPCP = CarInterface.get_starpilot_params(CAR.KIA_FORTE_2021_NON_SCC, fingerprint, [], CP, toggles)
car_state = CarState(CP, FPCP)
can_parsers = car_state.get_can_parsers(CP)
packer = CANPacker(DBC[CP.carFingerprint][Bus.pt])
def update(lkas_button: int, frame: int):
msg = packer.make_can_msg("CLU13", 0, {
"CF_Clu_LdwsLkasSW": lkas_button,
})
can_parsers[Bus.pt].update([(frame, [msg])])
return car_state.update(can_parsers, toggles)[0]
update(0, 1)
ret = update(1, 2)
assert any(be.type == ButtonType.lkas and be.pressed for be in ret.buttonEvents)
ret = update(0, 3)
assert any(be.type == ButtonType.lkas and not be.pressed for be in ret.buttonEvents)
def test_sonata_hybrid_uses_alt_bus_lkas_parser(self):
toggles = get_test_toggles()
fingerprint = gen_empty_fingerprint()
fingerprint[0][0x391] = 8
fingerprint[1][0x50C] = 8
CP = CarInterface.get_params(CAR.HYUNDAI_SONATA_HYBRID, fingerprint, [], False, False, False, toggles)
FPCP = CarInterface.get_starpilot_params(CAR.HYUNDAI_SONATA_HYBRID, fingerprint, [], CP, toggles)
car_state = CarState(CP, FPCP)
can_parsers = car_state.get_can_parsers(CP)
assert Bus.alt in can_parsers
def test_sonata_hybrid_alt_bus_clu13_lkas_button_event(self):
toggles = get_test_toggles()
fingerprint = gen_empty_fingerprint()
fingerprint[0][0x391] = 8
fingerprint[1][0x50C] = 8
CP = CarInterface.get_params(CAR.HYUNDAI_SONATA_HYBRID, fingerprint, [], False, False, False, toggles)
FPCP = CarInterface.get_starpilot_params(CAR.HYUNDAI_SONATA_HYBRID, fingerprint, [], CP, toggles)
car_state = CarState(CP, FPCP)
can_parsers = car_state.get_can_parsers(CP)
packer = CANPacker(DBC[CP.carFingerprint][Bus.pt])
def update(lkas_button: int, frame: int):
msg = packer.make_can_msg("CLU13", 1, {
"CF_Clu_SWL_Stat": lkas_button,
})
can_parsers[Bus.alt].update([(frame, [msg])])
return car_state.update(can_parsers, toggles)[0]
update(0, 1)
ret = update(4, 2)
assert any(be.type == ButtonType.lkas and be.pressed for be in ret.buttonEvents)
assert any(be.type == ButtonType.lkas and not be.pressed for be in ret.buttonEvents)
def test_genesis_g90_does_not_use_alt_bus_lkas_parser(self):
toggles = get_test_toggles()
CP = CarInterface.get_params(CAR.GENESIS_G90, gen_empty_fingerprint(), [], False, False, False, toggles)
FPCP = CarInterface.get_starpilot_params(CAR.GENESIS_G90, gen_empty_fingerprint(), [], CP, toggles)
car_state = CarState(CP, FPCP)
can_parsers = car_state.get_can_parsers(CP)
assert Bus.alt not in can_parsers
def test_ioniq_6_longitudinal_params_match_canfd_tune(self):
toggles = get_test_toggles()
CP = CarInterface.get_params(CAR.HYUNDAI_IONIQ_6, gen_empty_fingerprint(), [], True, False, False, toggles)
@@ -1323,6 +1503,16 @@ class TestHyundaiFingerprint:
assert sportage_params.ANGLE_LIMITS.MAX_ANGLE_RATE > comparison_params.ANGLE_LIMITS.MAX_ANGLE_RATE
assert comparison_params.ANGLE_LIMITS.MAX_LATERAL_JERK == ioniq6_params.ANGLE_LIMITS.MAX_LATERAL_JERK
def test_g90_and_palisade_2023_steer_max_limits(self):
g90 = CarParams.new_message()
g90.carFingerprint = CAR.GENESIS_G90
assert CarControllerParams(g90).STEER_MAX == GENESIS_G90_STEER_MAX
palisade_2023 = CarParams.new_message()
palisade_2023.carFingerprint = CAR.HYUNDAI_PALISADE_2023
palisade_2023.flags = int(HyundaiFlags.CAN_CANFD_BLENDED)
assert CarControllerParams(palisade_2023).STEER_MAX == HYUNDAI_PALISADE_2023_STEER_MAX
def test_ioniq_5_canfd_aux_messages_are_optional(self):
toggles = get_test_toggles()
fingerprint = gen_empty_fingerprint()
+51 -8
View File
@@ -19,8 +19,11 @@ SPORTAGE_HEV_2026_LOW_SPEED_JERK_WIDTH = 5.0
SPORTAGE_HEV_2026_MAX_ANGLE_RATE = 6.5
SPORTAGE_HEV_2026_STEER_ANGLE_MAX = 220.0
HYUNDAI_MANDO_FRONT_RADAR_DBC = "hyundai_kia_mando_front_radar_generated"
HYUNDAI_MRREVO14F_RADAR_DBC = "hyundai_mrrevo14f_radar_generated"
HYUNDAI_MRR30_RADAR_DBC = "hyundai_mrr30_radar_generated"
HYUNDAI_MRR35_RADAR_DBC = "hyundai_mrr35_radar_generated"
GENESIS_G90_STEER_MAX = 461
HYUNDAI_PALISADE_2023_STEER_MAX = 485
class CarControllerParams:
@@ -98,12 +101,15 @@ class CarControllerParams:
self.STEER_DELTA_DOWN = 3
elif CP.flags & HyundaiFlags.CAN_CANFD_BLENDED:
self.STEER_MAX = 404
self.STEER_MAX = HYUNDAI_PALISADE_2023_STEER_MAX
self.STEER_DRIVER_ALLOWANCE = 50
self.STEER_THRESHOLD = 150
self.STEER_DELTA_UP = 2
self.STEER_DELTA_DOWN = 3
elif CP.carFingerprint == CAR.GENESIS_G90:
self.STEER_MAX = GENESIS_G90_STEER_MAX
# Default for most HKG
else:
self.STEER_MAX = 384
@@ -224,9 +230,12 @@ class HyundaiNonSccCarDocs(CarDocs):
@dataclass
class HyundaiPlatformConfig(PlatformConfig):
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"})
radar_dbc: str | None = None
def init(self):
if self.flags & HyundaiFlags.MANDO_RADAR:
if self.radar_dbc is not None:
self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: self.radar_dbc}
elif self.flags & HyundaiFlags.MANDO_RADAR:
self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: HYUNDAI_MANDO_FRONT_RADAR_DBC}
if self.flags & HyundaiFlags.MIN_STEER_32_MPH:
@@ -250,8 +259,12 @@ class HyundaiCanFDPlatformConfig(PlatformConfig):
@dataclass
class HyundaiNonSccPlatformConfig(PlatformConfig):
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"})
radar_dbc: str | None = None
def init(self):
if self.radar_dbc is not None:
self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: self.radar_dbc}
self.flags |= HyundaiFlags.NON_SCC
if self.flags & HyundaiFlags.MIN_STEER_32_MPH:
@@ -313,7 +326,7 @@ class CAR(Platforms):
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,
flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH | HyundaiFlags.MANDO_RADAR,
)
HYUNDAI_IONIQ_HEV_2022 = HyundaiPlatformConfig(
[HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))],
@@ -369,6 +382,7 @@ class CAR(Platforms):
[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,
radar_dbc=HYUNDAI_MRREVO14F_RADAR_DBC,
)
HYUNDAI_KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig(
[
@@ -400,17 +414,17 @@ class CAR(Platforms):
[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,
flags=HyundaiFlags.MANDO_RADAR | 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,
flags=HyundaiFlags.MANDO_RADAR | 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,
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
)
HYUNDAI_SANTA_FE_HEV_5TH_GEN = HyundaiCanFDPlatformConfig(
[
@@ -749,6 +763,7 @@ class CAR(Platforms):
],
CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65),
flags=HyundaiFlags.EV,
radar_dbc=HYUNDAI_MRR30_RADAR_DBC,
)
KIA_EV6_2025 = HyundaiCanFDPlatformConfig(
[
@@ -783,6 +798,7 @@ class CAR(Platforms):
],
CarSpecs(mass=2205, wheelbase=2.9, steerRatio=17.6),
flags=HyundaiFlags.EV,
radar_dbc=HYUNDAI_MRR30_RADAR_DBC,
)
GENESIS_G70 = HyundaiPlatformConfig(
[HyundaiCarDocs("Genesis G70 2018", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))],
@@ -875,6 +891,7 @@ class CAR(Platforms):
[HyundaiNonSccCarDocs("Hyundai Kona Non-SCC 2019", car_parts=CarParts.common([CarHarness.hyundai_b]))],
HYUNDAI_KONA.specs,
flags=HyundaiFlags.ALT_LIMITS,
radar_dbc=HYUNDAI_MRREVO14F_RADAR_DBC,
)
HYUNDAI_KONA_EV_NON_SCC = HyundaiNonSccPlatformConfig(
[HyundaiNonSccCarDocs("Hyundai Kona Electric Non-SCC 2019", car_parts=CarParts.common([CarHarness.hyundai_g]))],
@@ -920,6 +937,22 @@ CANCEL_BUTTON_ENABLE_CARS = frozenset({
})
# These classic HKG platforms publish the LKAS button on CLU13 over the alt bus.
# Keep G90 excluded until its alt-bus path is route-proven without the recent
# engage/disengage regression.
ALT_BUS_LDA_BUTTON_CARS = frozenset({
CAR.HYUNDAI_SONATA,
CAR.HYUNDAI_SONATA_HYBRID,
})
# On these Sonata layouts the alt-bus LKAS button pulses through the CLU13
# steering-wheel-status field instead of the dedicated LKAS bit.
ALT_BUS_LDA_BUTTON_SWL_STAT_CARS = frozenset({
CAR.HYUNDAI_SONATA,
CAR.HYUNDAI_SONATA_HYBRID,
})
def hyundai_cancel_button_enables_cruise(car_fingerprint) -> bool:
return car_fingerprint in CANCEL_BUTTON_ENABLE_CARS
@@ -1081,6 +1114,7 @@ FW_QUERY_CONFIG = FwQueryConfig(
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],
Ecu.fwdRadar: [CAR.HYUNDAI_KONA_NON_SCC],
},
extra_ecus=[
(Ecu.adas, 0x730, None), # ADAS Driving ECU on platforms with LKA steering
@@ -1110,8 +1144,17 @@ CANFD_RADAR_SCC_CAR = CAR.with_flags(HyundaiFlags.RADAR_SCC) # TODO: merge with
# CAN-FD cars with ADAS ECUs that work with the communication-control path.
CANFD_SECURITYACCESS_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.HYUNDAI_KONA_EV_2ND_GEN}
CANFD_UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.CANFD_NO_RADAR_DISABLE) - CANFD_SECURITYACCESS_CAR # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR
CANFD_RADAR_LIVE_LONGITUDINAL_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6}
RADAR_LIVE_LONGITUDINAL_CAR = CANFD_RADAR_LIVE_LONGITUDINAL_CAR | {CAR.GENESIS_G90}
CANFD_RADAR_LIVE_LONGITUDINAL_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.KIA_EV6, CAR.GENESIS_GV60_EV_1ST_GEN}
RADAR_LIVE_LONGITUDINAL_CAR = CANFD_RADAR_LIVE_LONGITUDINAL_CAR | {
CAR.HYUNDAI_IONIQ,
CAR.HYUNDAI_KONA_EV_2022,
CAR.HYUNDAI_SANTA_FE_2022,
CAR.HYUNDAI_SANTA_FE_HEV_2022,
CAR.HYUNDAI_SANTA_FE_PHEV_2022,
CAR.HYUNDAI_SONATA,
CAR.HYUNDAI_SONATA_HYBRID,
CAR.GENESIS_G90,
}
CAMERA_SCC_CAR = CAR.with_flags(HyundaiFlags.CAMERA_SCC)
+14 -5
View File
@@ -20,7 +20,7 @@ from opendbc.car.common.simple_kalman import KF1D, get_kalman_gain
from opendbc.car.gm.values import CAR as GM
from opendbc.car.honda.values import CAR as HONDA, HONDA_BOSCH, HondaFlags, HondaSafetyFlags, HondaStarPilotFlags
from opendbc.car.hyundai.hyundaicanfd import CanBus
from opendbc.car.hyundai.values import CAR as HYUNDAI, CANFD_CAR, HyundaiFlags, HyundaiStarPilotFlags, HyundaiStarPilotSafetyFlags
from opendbc.car.hyundai.values import CAR as HYUNDAI, CANFD_CAR, HyundaiFlags, HyundaiStarPilotFlags, HyundaiStarPilotSafetyFlags, ALT_BUS_LDA_BUTTON_CARS
from opendbc.car.mock.values import CAR as MOCK
from opendbc.car.toyota.values import CAR as TOYOTA, NO_DSU_CAR, TSS2_CAR, UNSUPPORTED_DSU_CAR, ToyotaStarPilotFlags, ToyotaSafetyFlags
from opendbc.car.values import PLATFORMS
@@ -199,6 +199,7 @@ class CarInterfaceBase(ABC):
def get_starpilot_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], CP: structs.CarParams, starpilot_toggles: SimpleNamespace):
fp_ret = custom.StarPilotCarParams.new_message()
fp_ret.pcmCruiseSpeed = True
params = Params(return_defaults=True)
platform = PLATFORMS[candidate]
@@ -228,14 +229,22 @@ class CarInterfaceBase(ABC):
if 0x1FA in fingerprint[CAN.ECAN]:
fp_ret.flags |= HyundaiStarPilotFlags.SPEED_LIMIT_AVAILABLE.value
fp_ret.redneckCruiseAvailable = not bool(CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS)
if fp_ret.redneckCruiseAvailable and Params(return_defaults=True).get_bool("RedneckCruise") and \
fp_ret.redneckCruiseAvailable = bool(CP.flags & HyundaiFlags.NON_SCC) and not bool(CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS)
if fp_ret.redneckCruiseAvailable and params.get_bool("RedneckCruise") and \
not CP.openpilotLongitudinalControl:
fp_ret.pcmCruiseSpeed = False
if 0x391 in fingerprint[0] or CP.flags & HyundaiFlags.CAN_CANFD_BLENDED:
hyundai_has_lda_button = (
0x391 in fingerprint[0] or
0x50C in fingerprint[0] or
candidate in ALT_BUS_LDA_BUTTON_CARS or
bool(CP.flags & HyundaiFlags.CAN_CANFD_BLENDED)
)
if hyundai_has_lda_button:
fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON.value
if starpilot_toggles.always_on_lateral_lkas:
# LKASButtonControl == 9 means BUTTON_FUNCTIONS["AOL_TOGGLE"] in starpilot_variables.
if params.get_bool("AlwaysOnLateral") and params.get_int("LKASButtonControl") == 9:
fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE.value
elif platform in TOYOTA:
fp_ret.canUsePedal = not CP.autoResumeSng
@@ -65,6 +65,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"HONDA_E" = "HONDA_CIVIC_BOSCH"
"BUICK_LACROSSE" = "CHEVROLET_VOLT"
"BUICK_LACROSSE_ASCM" = "CHEVROLET_VOLT"
"BUICK_REGAL" = "CHEVROLET_VOLT"
"CADILLAC_ESCALADE_ASCM" = "CADILLAC_ESCALADE"
"CADILLAC_ESCALADE_ESV" = "CHEVROLET_VOLT"
@@ -1 +0,0 @@
_*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";
@@ -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";
@@ -1,2 +0,0 @@
hyundai_kia_mando_front_radar.dbc
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
@@ -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
@@ -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_ 528 RADAR_TRACK_210: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 529 RADAR_TRACK_211: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 530 RADAR_TRACK_212: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 531 RADAR_TRACK_213: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 532 RADAR_TRACK_214: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 533 RADAR_TRACK_215: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 534 RADAR_TRACK_216: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 535 RADAR_TRACK_217: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 536 RADAR_TRACK_218: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 537 RADAR_TRACK_219: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 538 RADAR_TRACK_21a: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 539 RADAR_TRACK_21b: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 540 RADAR_TRACK_21c: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 541 RADAR_TRACK_21d: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 542 RADAR_TRACK_21e: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
BO_ 543 RADAR_TRACK_21f: 32 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ 1_COUNTER_255 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ 1_STATE_ALT : 51|4@0+ (1,0) [0|15] "" XXX
SG_ 1_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ 1_NEW_SIGNAL_3 : 63|8@0- (1,0) [0|255] "" XXX
SG_ 1_LONG_DIST : 64|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 1_LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX
SG_ 1_REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ 1_NEW_SIGNAL_1 : 102|2@1+ (1,0) [0|3] "" XXX
SG_ 1_LAT_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ 1_REL_ACCEL : 118|10@1- (1,0) [0|1023] "" XXX
SG_ 2_COUNTER_255 : 175|8@0+ (1,0) [0|255] "" XXX
SG_ 2_STATE_ALT : 179|4@0+ (1,0) [0|15] "" XXX
SG_ 2_STATE : 183|4@0+ (1,0) [0|15] "" XXX
SG_ 2_NEW_SIGNAL_3 : 191|8@0- (1,0) [0|255] "" XXX
SG_ 2_LONG_DIST : 192|12@1+ (0.05,0) [0|4095] "" XXX
SG_ 2_LAT_DIST : 204|12@1- (0.05,0) [0|4095] "" XXX
SG_ 2_REL_SPEED : 216|14@1- (0.01,0) [0|65535] "" XXX
SG_ 2_NEW_SIGNAL_1 : 230|2@1+ (1,0) [0|3] "" XXX
SG_ 2_LAT_ACCEL : 232|13@1- (1,0) [0|8191] "" XXX
SG_ 2_REL_ACCEL : 246|10@1- (1,0) [0|1023] "" XXX
@@ -0,0 +1,997 @@
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_ 933 RADAR_TRACK_3a5: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 934 RADAR_TRACK_3a6: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 935 RADAR_TRACK_3a7: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 936 RADAR_TRACK_3a8: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 937 RADAR_TRACK_3a9: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 938 RADAR_TRACK_3aa: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 939 RADAR_TRACK_3ab: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 940 RADAR_TRACK_3ac: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 941 RADAR_TRACK_3ad: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 942 RADAR_TRACK_3ae: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 943 RADAR_TRACK_3af: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 944 RADAR_TRACK_3b0: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 945 RADAR_TRACK_3b1: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 946 RADAR_TRACK_3b2: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 947 RADAR_TRACK_3b3: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 948 RADAR_TRACK_3b4: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 949 RADAR_TRACK_3b5: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 950 RADAR_TRACK_3b6: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 951 RADAR_TRACK_3b7: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 952 RADAR_TRACK_3b8: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 953 RADAR_TRACK_3b9: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 954 RADAR_TRACK_3ba: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 955 RADAR_TRACK_3bb: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 956 RADAR_TRACK_3bc: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 957 RADAR_TRACK_3bd: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 958 RADAR_TRACK_3be: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 959 RADAR_TRACK_3bf: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 960 RADAR_TRACK_3c0: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 961 RADAR_TRACK_3c1: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 962 RADAR_TRACK_3c2: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 963 RADAR_TRACK_3c3: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
BO_ 964 RADAR_TRACK_3c4: 24 RADAR
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_1 : 25|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_3 : 28|2@0+ (1,0) [0|3] "" XXX
SG_ COUNTER_3 : 31|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_2 : 38|7@0- (1,0) [0|127] "" XXX
SG_ COUNTER_256 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ NEW_SIGNAL_6 : 51|4@0+ (1,0) [0|15] "" XXX
SG_ STATE : 54|3@0+ (1,0) [0|7] "" XXX
SG_ NEW_SIGNAL_8 : 62|7@0- (1,0) [0|127] "" XXX
SG_ LONG_DIST : 63|12@1+ (0.05,0) [0|8191] "m" XXX
SG_ LAT_DIST : 76|12@1- (0.05,0) [0|127] "" XXX
SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX
SG_ NEW_SIGNAL_4 : 103|2@0+ (1,0) [0|3] "" XXX
SG_ LAT_DIST_ACCEL : 104|13@1- (1,0) [0|8191] "" XXX
SG_ REL_ACCEL : 118|10@1- (0.02,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_18 : 129|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_5 : 133|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_10 : 138|5@1+ (1,0) [0|31] "" XXX
SG_ NEW_SIGNAL_11 : 149|6@0+ (1,0) [0|63] "" XXX
SG_ NEW_SIGNAL_7 : 152|10@1+ (1,0) [0|1023] "" XXX
SG_ NEW_SIGNAL_9 : 162|9@1- (1,0) [0|511] "" XXX
SG_ NEW_SIGNAL_13 : 175|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_12 : 179|4@0+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_14 : 181|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_15 : 183|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_16 : 185|2@0+ (1,0) [0|3] "" XXX
SG_ NEW_SIGNAL_17 : 187|2@0+ (1,0) [0|3] "" XXX
@@ -0,0 +1,251 @@
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_ 1537 RADAR_LEAD: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1538 RADAR_TRACK_602: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1539 RADAR_TRACK_603: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1540 RADAR_TRACK_604: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1541 RADAR_TRACK_605: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1542 RADAR_TRACK_606: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1543 RADAR_TRACK_607: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1544 RADAR_TRACK_608: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1545 RADAR_TRACK_609: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1546 RADAR_TRACK_60a: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1547 RADAR_TRACK_60b: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1548 RADAR_TRACK_60c: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1549 RADAR_TRACK_60d: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1550 RADAR_TRACK_60e: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1551 RADAR_TRACK_60f: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1552 RADAR_TRACK_610: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1553 RADAR_TRACK_611: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1554 RADAR_ALT_612: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1555 RADAR_ALT_613: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1556 RADAR_ALT_614: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1557 RADAR_ALT_615: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1558 RADAR_ALT_616: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1559 RADAR_ALT_617: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
@@ -0,0 +1,80 @@
#!/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
BO_ 1537 RADAR_LEAD: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
""")
for a in range(0x602, 0x602 + 16):
f.write(f"""
BO_ {a} RADAR_TRACK_{a:x}: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
""")
for a in range(0x612, 0x612 + 6):
f.write(f"""
BO_ {a} RADAR_ALT_{a:x}: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
""")
@@ -1 +0,0 @@
rivian_mando_front_radar.dbc
@@ -0,0 +1,358 @@
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
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) [-61.2|62.1] "" XXX
SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX
SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX
SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX
SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX
@@ -1 +0,0 @@
*.dbc
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,254 @@
CM_ "AUTOGENERATED FILE, DO NOT EDIT";
CM_ "hyundai_mrrevo14f_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_ 1537 RADAR_LEAD: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1538 RADAR_TRACK_602: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1539 RADAR_TRACK_603: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1540 RADAR_TRACK_604: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1541 RADAR_TRACK_605: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1542 RADAR_TRACK_606: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1543 RADAR_TRACK_607: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1544 RADAR_TRACK_608: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1545 RADAR_TRACK_609: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1546 RADAR_TRACK_60a: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1547 RADAR_TRACK_60b: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1548 RADAR_TRACK_60c: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1549 RADAR_TRACK_60d: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1550 RADAR_TRACK_60e: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1551 RADAR_TRACK_60f: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1552 RADAR_TRACK_610: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1553 RADAR_TRACK_611: 8 RADAR
SG_ 1_DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 1_LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 1_SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ 2_DISTANCE : 31|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ 2_LATERAL : 41|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ 2_SPEED : 52|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ COUNTER : 62|2@1+ (1,0) [0|3] "" XXX
BO_ 1554 RADAR_ALT_612: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1555 RADAR_ALT_613: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1556 RADAR_ALT_614: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1557 RADAR_ALT_615: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1558 RADAR_ALT_616: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
BO_ 1559 RADAR_ALT_617: 8 RADAR
SG_ DISTANCE : 0|10@1+ (0.25,0) [0|255.75] "" XXX
SG_ LATERAL : 10|11@1+ (0.03,-30.705) [-30.705|30.705] "" XXX
SG_ SPEED : 21|10@1+ (0.25,-128) [-128|127.75] "" XXX
SG_ ID : 31|9@1+ (1,0) [0|511] "" XXX
SG_ SOMETHING_1 : 42|8@1+ (1,-128) [-128|127] "" XXX
SG_ SOMETHING_2 : 50|6@1+ (1,-32) [-32|31] "" XXX
SG_ COUNTER : 56|4@1+ (1,0) [0|15] "" XXX
SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "" XXX
+12 -3
View File
@@ -56,7 +56,9 @@ const LongitudinalLimits HYUNDAI_LONG_LIMITS = {
{.msg = {{0x91, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
#define HYUNDAI_LDA_BUTTON_ADDR_CHECK \
{.msg = {{0x391, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
{.msg = {{0x391, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
{0x50C, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
{0x50C, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}}}, \
#define HYUNDAI_NON_SCC_HEV_ADDR_CHECK \
{.msg = {{0x595U, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
@@ -226,6 +228,10 @@ static void hyundai_rx_hook(const CANPacket_t *msg) {
if (msg->addr == 0x391U) {
hyundai_lkas_button_check(GET_BIT(msg, 4U));
}
if ((msg->addr == 0x50CU) && ((msg->bus == 0U) || (msg->bus == 1U))) {
hyundai_lkas_button_check(GET_BIT(msg, 56U));
}
}
hyundai_common_reset_acc_main_on_mismatches();
@@ -233,9 +239,10 @@ static void hyundai_rx_hook(const CANPacket_t *msg) {
static bool hyundai_tx_hook(const CANPacket_t *msg) {
const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS = HYUNDAI_LIMITS(384, 3, 7);
const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_G90 = HYUNDAI_LIMITS(461, 3, 7);
const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_ALT = HYUNDAI_LIMITS(270, 2, 3);
const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_ALT_2 = HYUNDAI_LIMITS(170, 2, 3);
const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_CAN_CANFD_BLENDED = HYUNDAI_LIMITS(404, 2, 3);
const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_CAN_CANFD_BLENDED = HYUNDAI_LIMITS(485, 2, 3);
bool tx = true;
@@ -284,7 +291,9 @@ static bool hyundai_tx_hook(const CANPacket_t *msg) {
int desired_torque = ((GET_BYTES(msg, 0, 4) >> 16) & 0x7ffU) - 1024U;
bool steer_req = GET_BIT(msg, 27U);
const TorqueSteeringLimits limits = hyundai_can_canfd_blended ? HYUNDAI_STEERING_LIMITS_CAN_CANFD_BLENDED :
const bool hyundai_g90_limits = hyundai_has_lda_button && hyundai_aol_lkas_on_engage; // G90 path sets both bits
const TorqueSteeringLimits limits = hyundai_g90_limits ? HYUNDAI_STEERING_LIMITS_G90 :
hyundai_can_canfd_blended ? HYUNDAI_STEERING_LIMITS_CAN_CANFD_BLENDED :
hyundai_alt_limits_2 ? HYUNDAI_STEERING_LIMITS_ALT_2 :
hyundai_alt_limits ? HYUNDAI_STEERING_LIMITS_ALT : HYUNDAI_STEERING_LIMITS;
@@ -151,6 +151,17 @@ class TestHyundaiSafetyAltLimits2(TestHyundaiSafety):
self.safety.init_tests()
class TestHyundaiSafetyGenesisG90(TestHyundaiSafety):
MAX_TORQUE_LOOKUP = [0], [461]
def setUp(self):
self.packer = CANPackerSafety("hyundai_kia_generic")
self.safety = libsafety_py.libsafety
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai,
HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON | HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE)
self.safety.init_tests()
class TestHyundaiSafetyCameraSCC(TestHyundaiSafety):
BUTTONS_TX_BUS = 2 # tx on 2, rx on 0
SCC_BUS = 2 # rx on 2
@@ -213,7 +224,7 @@ class TestHyundaiCanCanfdBlendedSafety(TestHyundaiSafety):
FWD_BLACKLISTED_ADDRS = {2: [0x340, 0x485, 0x364]}
MAX_RATE_UP = 2
MAX_RATE_DOWN = 3
MAX_TORQUE_LOOKUP = [0], [404]
MAX_TORQUE_LOOKUP = [0], [485]
def setUp(self):
self.packer = CANPackerSafety("hyundai_palisade_2023_generated")
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,2 +1,2 @@
extern const uint8_t gitversion[19];
const uint8_t gitversion[19] = "DEV-f06c82b2-DEBUG";
const uint8_t gitversion[19] = "DEV-2486728e-DEBUG";
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
DEV-f06c82b2-DEBUG
DEV-2486728e-DEBUG
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

+1
View File
@@ -47,6 +47,7 @@ GM_STANDSTILL_BRAKE_CAMERA_CARS = {
GM_CAR.CHEVROLET_VOLT_CC,
GM_CAR.CHEVROLET_MALIBU,
GM_CAR.CHEVROLET_MALIBU_ASCM,
GM_CAR.BUICK_LACROSSE_ASCM,
GM_CAR.CHEVROLET_MALIBU_SDGM,
GM_CAR.CHEVROLET_MALIBU_CC,
GM_CAR.CHEVROLET_MALIBU_HYBRID_CC,
+84 -15
View File
@@ -22,7 +22,7 @@ from opendbc.safety import ALTERNATIVE_EXPERIENCE
from openpilot.selfdrive.pandad import can_capnp_to_list, can_list_to_can_capnp
from openpilot.common.constants import CV
from openpilot.selfdrive.car.cruise import VCruiseHelper, IMPERIAL_INCREMENT, V_CRUISE_MAX, V_CRUISE_MIN
from openpilot.selfdrive.car.redneck_cruise import RedneckCruise
from openpilot.selfdrive.car.redneck_cruise import RedneckCruise, SEND_BUTTON_DECREASE, SEND_BUTTON_INCREASE, select_redneck_target_speed
from openpilot.selfdrive.car.car_specific import MockCarState
from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles, update_starpilot_toggles
@@ -30,6 +30,8 @@ from openpilot.starpilot.controls.starpilot_card import StarPilotCard
REPLAY = "REPLAY" in os.environ
OPENPILOT_LEAD_MIN_DISTANCE = 0.1
REDNECK_DECREASE_LOOKAHEAD_POINTS = 10
REDNECK_AUTO_BUTTON_FILTER_FRAMES = int(0.3 / DT_CTRL)
EventName = log.OnroadEvent.EventName
@@ -73,6 +75,14 @@ class Car:
FPCP: custom.StarPilotCarParams
class _ButtonEventFilteredCarState:
def __init__(self, car_state: car.CarState, button_events):
self._car_state = car_state
self.buttonEvents = button_events
def __getattr__(self, name: str):
return getattr(self._car_state, name)
def __init__(self, CI=None, RI=None) -> None:
self.can_sock = messaging.sub_sock('can', timeout=20)
self.sm = messaging.SubMaster(['pandaStates', 'carControl', 'onroadEvents', 'radarState', 'longitudinalPlan'])
@@ -165,8 +175,12 @@ class Car:
self.params.put_nonblocking("CarParamsPersistent", cp_bytes)
self.mock_carstate = MockCarState()
self.v_cruise_helper = VCruiseHelper(self.CP)
self.redneck_cruise = RedneckCruise(self.CP, self.FPCP) if self.CP.brand == "hyundai" else None
self.v_cruise_helper = VCruiseHelper(self.CP, self.FPCP)
self.redneck_cruise = RedneckCruise(self.CP, self.FPCP) if self.CP.brand == "hyundai" and self.FPCP.redneckCruiseAvailable and not self.FPCP.pcmCruiseSpeed else None
self.redneck_button_event_filter_frames = {
int(ButtonType.accelCruise): 0,
int(ButtonType.decelCruise): 0,
}
self.is_metric = self.params.get_bool("IsMetric")
self.safe_mode = self.params.get_bool("SafeMode")
@@ -215,6 +229,9 @@ class Car:
self.sm.update(0)
self._advance_redneck_button_feedback_filter()
filtered_CS = self._get_button_event_filtered_state(CS)
can_rcv_valid = len(can_strs) > 0
# Check for CAN timeout
@@ -230,7 +247,7 @@ class Car:
)
if not preap_software_cruise:
self.v_cruise_helper.update_v_cruise(
CS,
filtered_CS,
self.sm['carControl'].enabled,
self.is_metric,
self.sm['starpilotPlan'].speedLimitChanged,
@@ -266,9 +283,9 @@ class Car:
CS.vCruise = float(self.v_cruise_helper.v_cruise_kph)
CS.vCruiseCluster = float(self.v_cruise_helper.v_cruise_cluster_kph)
if any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in CS.buttonEvents):
if any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in filtered_CS.buttonEvents):
self.resume_prev_button = True
elif any(be.type in (ButtonType.decelCruise, ButtonType.setCruise) for be in CS.buttonEvents):
elif any(be.type in (ButtonType.decelCruise, ButtonType.setCruise) for be in filtered_CS.buttonEvents):
self.resume_prev_button = False
FPCS = self.starpilot_card.update(CS, FPCS, self.sm, self.starpilot_toggles)
@@ -345,6 +362,7 @@ class Car:
self._update_redneck_cruise(CS, CC)
self._update_openpilot_lead_state(CC)
self.last_actuators_output, can_sends = self.CI.apply(CC, now_nanos, self.starpilot_toggles)
self._record_redneck_button_feedback_filter()
self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=CS.canValid))
self.CC_prev = CC
@@ -373,19 +391,70 @@ class Car:
if self.redneck_cruise is None:
return
send_button, v_target = self.redneck_cruise.run(CS, CC, self._get_redneck_target_speed(), self.is_metric)
filtered_CS = self._get_button_event_filtered_state(CS)
send_button, v_target = self.redneck_cruise.run(filtered_CS, CC, self._get_redneck_target_speed(CS), self.is_metric)
self.CI.CS.redneck_send_button = send_button
self.CI.CS.redneck_v_target = v_target
def _get_redneck_target_speed(self) -> float:
if self.sm.seen['longitudinalPlan'] and self.sm.valid['longitudinalPlan']:
speeds = self.sm['longitudinalPlan'].speeds
if len(speeds) > 0:
target_speed = float(speeds[0])
if math.isfinite(target_speed):
return target_speed
def _get_redneck_target_speed(self, CS: car.CarState) -> float:
starpilot_target_speed = 0.0
if self.sm.seen['starpilotPlan'] and self.sm.valid['starpilotPlan']:
starpilot_target_speed = float(self.sm['starpilotPlan'].vCruise)
return float(self.sm['starpilotPlan'].vCruise)
plan_speeds = []
if self.sm.seen['longitudinalPlan'] and self.sm.valid['longitudinalPlan']:
plan_speeds = [float(speed) for speed in self.sm['longitudinalPlan'].speeds if math.isfinite(float(speed))]
return select_redneck_target_speed(
float(getattr(CS, "vCruise", 0.0)),
float(CS.cruiseState.speedCluster),
starpilot_target_speed,
plan_speeds,
REDNECK_DECREASE_LOOKAHEAD_POINTS,
)
def _advance_redneck_button_feedback_filter(self) -> None:
if self.redneck_cruise is None:
return
for button_type in self.redneck_button_event_filter_frames:
self.redneck_button_event_filter_frames[button_type] = max(0, self.redneck_button_event_filter_frames[button_type] - 1)
def _get_filtered_redneck_button_events(self, CS: car.CarState):
if self.redneck_cruise is None or len(CS.buttonEvents) == 0:
return CS.buttonEvents
if not any(self.redneck_button_event_filter_frames.values()):
return CS.buttonEvents
filtered_button_events = []
filtered_any = False
for event in CS.buttonEvents:
button_type = event.type.raw if hasattr(event.type, "raw") else int(event.type)
if self.redneck_button_event_filter_frames.get(button_type, 0) > 0:
filtered_any = True
continue
filtered_button_events.append(event)
return filtered_button_events if filtered_any else CS.buttonEvents
def _get_button_event_filtered_state(self, CS: car.CarState):
filtered_button_events = self._get_filtered_redneck_button_events(CS)
if filtered_button_events is CS.buttonEvents:
return CS
return self._ButtonEventFilteredCarState(CS, filtered_button_events)
def _record_redneck_button_feedback_filter(self) -> None:
if self.redneck_cruise is None:
return
sent_button = int(getattr(self.CI.CS, "redneck_last_sent_button", 0) or 0)
if sent_button == SEND_BUTTON_INCREASE:
self.redneck_button_event_filter_frames[int(ButtonType.accelCruise)] = REDNECK_AUTO_BUTTON_FILTER_FRAMES
elif sent_button == SEND_BUTTON_DECREASE:
self.redneck_button_event_filter_frames[int(ButtonType.decelCruise)] = REDNECK_AUTO_BUTTON_FILTER_FRAMES
self.CI.CS.redneck_last_sent_button = 0
def step(self):
CS, RD, FPCS = self.state_update()
+19 -5
View File
@@ -32,7 +32,7 @@ CRUISE_INTERVAL_SIGN = {
class VCruiseHelper:
def __init__(self, CP):
def __init__(self, CP, FPCP=None):
self.CP = CP
self.v_cruise_kph = V_CRUISE_UNSET
self.v_cruise_cluster_kph = V_CRUISE_UNSET
@@ -41,6 +41,9 @@ class VCruiseHelper:
self.button_change_states = {btn: {"standstill": False, "enabled": False} for btn in self.button_timers}
self.gm_cc_only = self.CP.carFingerprint in CC_ONLY_CAR and self.CP.flags & GMFlags.CC_LONG.value
self.redneck_non_pcm = bool(FPCP is not None and
getattr(FPCP, "redneckCruiseAvailable", False) and
not getattr(FPCP, "pcmCruiseSpeed", True))
def _get_short_press_delta(self, is_metric, starpilot_toggles: SimpleNamespace) -> float:
base_delta = 1. if is_metric else IMPERIAL_INCREMENT
@@ -50,6 +53,15 @@ class VCruiseHelper:
def _get_cruise_delta_interval(interval: float | None) -> float:
return interval if isinstance(interval, (int, float)) and interval > 0 else 1.0
def _get_cruise_delta_intervals(self, starpilot_toggles: SimpleNamespace) -> tuple[float, float]:
short_interval = self._get_cruise_delta_interval(getattr(starpilot_toggles, "cruise_increase", None))
long_interval = self._get_cruise_delta_interval(getattr(starpilot_toggles, "cruise_increase_long", None))
if getattr(starpilot_toggles, "reverse_cruise_increase", False):
return long_interval, short_interval
return short_interval, long_interval
@property
def v_cruise_initialized(self):
return self.v_cruise_kph != V_CRUISE_UNSET
@@ -58,7 +70,7 @@ class VCruiseHelper:
self.v_cruise_kph_last = self.v_cruise_kph
if CS.cruiseState.available:
if self.gm_cc_only or not self.CP.pcmCruise:
if self.gm_cc_only or self.redneck_non_pcm or not self.CP.pcmCruise:
# if stock cruise is completely disabled, then we can use our own set speed logic
self._update_v_cruise_non_pcm(CS, enabled, is_metric, speed_limit_changed, starpilot_toggles)
self.v_cruise_cluster_kph = self.v_cruise_kph
@@ -116,8 +128,8 @@ class VCruiseHelper:
if not self.button_change_states[button_type]["enabled"]:
return
delta_interval = starpilot_toggles.cruise_increase_long if long_press else starpilot_toggles.cruise_increase
v_cruise_delta_interval = self._get_cruise_delta_interval(delta_interval)
short_interval, long_interval = self._get_cruise_delta_intervals(starpilot_toggles)
v_cruise_delta_interval = long_interval if long_press else short_interval
v_cruise_delta = v_cruise_delta * v_cruise_delta_interval
if v_cruise_delta_interval % 5 == 0 and self.v_cruise_kph % v_cruise_delta != 0: # partial interval
self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta
@@ -145,7 +157,7 @@ class VCruiseHelper:
def initialize_v_cruise(self, CS, experimental_mode: bool, resume_prev_button: bool,
starpilot_toggles: SimpleNamespace, desired_speed_limit: float = 0.0) -> None:
# initializing is handled by the PCM
if self.CP.pcmCruise and not self.gm_cc_only:
if self.CP.pcmCruise and not (self.gm_cc_only or self.redneck_non_pcm):
return
engage_floor_kph = max(V_CRUISE_MIN, 7.0 * CV.MPH_TO_KPH)
@@ -158,6 +170,8 @@ class VCruiseHelper:
# the custom cruise-button interval.
initialized_speed_limit_kph = round(desired_speed_limit * CV.MS_TO_KPH, 1)
self.v_cruise_kph = float(np.clip(initialized_speed_limit_kph, V_CRUISE_MIN, V_CRUISE_MAX))
elif self.redneck_non_pcm and CS.cruiseState.speedCluster > 0:
self.v_cruise_kph = float(np.clip(CS.cruiseState.speedCluster * CV.MS_TO_KPH, V_CRUISE_MIN, V_CRUISE_MAX))
else:
self.v_cruise_kph = int(round(np.clip(CS.vEgo * CV.MS_TO_KPH, engage_floor_kph, V_CRUISE_MAX)))
+64 -25
View File
@@ -10,7 +10,8 @@ SEND_BUTTON_INCREASE = 1
SEND_BUTTON_DECREASE = 2
HYST_GAP = 0.0
INACTIVE_TIMER = 0.4
INCREASE_INACTIVE_TIMER = 0.4
DECREASE_INACTIVE_TIMER = 0.1
CRUISE_BUTTON_TIMERS = {
int(ButtonType.decelCruise): 0,
@@ -22,6 +23,23 @@ CRUISE_BUTTON_TIMERS = {
}
def select_redneck_target_speed(v_cruise_kph: float, speed_cluster_ms: float,
starpilot_target_speed_ms: float, plan_speeds_ms: list[float],
lookahead_points: int) -> float:
target_speed_ms = float(speed_cluster_ms)
if v_cruise_kph > 0:
target_speed_ms = float(v_cruise_kph) * CV.KPH_TO_MS
elif starpilot_target_speed_ms > 0:
target_speed_ms = float(starpilot_target_speed_ms)
if len(plan_speeds_ms) > 0:
decrease_target_speed_ms = min(plan_speeds_ms[:lookahead_points])
if decrease_target_speed_ms < min(target_speed_ms, float(speed_cluster_ms)):
return decrease_target_speed_ms
return target_speed_ms
def get_minimum_set_speed(is_metric: bool) -> int:
return 30 if is_metric else 20
@@ -80,32 +98,53 @@ class RedneckCruise:
button_pressed = any(timer > 0 for timer in self.cruise_button_timers.values())
self.is_ready = CC.enabled and not CC.cruiseControl.override and not CC.cruiseControl.cancel and not CC.cruiseControl.resume and not button_pressed
def _update_state_machine(self) -> int:
self.pre_active_timer = max(0, self.pre_active_timer - 1)
def _desired_state(self) -> str:
if self.v_target > self.v_cruise_cluster:
return "increasing"
if self.v_target < self.v_cruise_cluster and self.v_cruise_cluster > self.v_cruise_min:
return "decreasing"
return "holding"
if self.state != "inactive":
if not self.is_ready:
self.state = "inactive"
elif self.state == "preActive":
@staticmethod
def _get_pre_active_frames(state: str) -> int:
timer = DECREASE_INACTIVE_TIMER if state == "decreasing" else INCREASE_INACTIVE_TIMER
return int(timer / DT_CTRL)
def _arm_pre_active(self, desired_state: str) -> None:
if desired_state == "holding":
self.state = "holding"
self.pre_active_timer = 0
return
self.state = "preActive"
self.pre_active_timer = self._get_pre_active_frames(desired_state)
def _update_state_machine(self) -> int:
desired_state = self._desired_state()
if not self.is_ready:
self.state = "inactive"
self.pre_active_timer = 0
elif self.state == "inactive":
if not self.is_ready_prev:
self._arm_pre_active(desired_state)
elif self.state == "preActive":
if desired_state == "holding":
self.state = "holding"
self.pre_active_timer = 0
else:
desired_frames = self._get_pre_active_frames(desired_state)
self.pre_active_timer = max(0, min(self.pre_active_timer, desired_frames) - 1)
if self.pre_active_timer <= 0:
if self.v_target == self.v_cruise_cluster:
self.state = "holding"
elif self.v_target > self.v_cruise_cluster:
self.state = "increasing"
elif self.v_target < self.v_cruise_cluster and self.v_cruise_cluster > self.v_cruise_min:
self.state = "decreasing"
elif self.state == "holding":
if self.v_target != self.v_cruise_cluster:
self.state = "preActive"
elif self.state == "increasing":
if self.v_target <= self.v_cruise_cluster:
self.state = "holding"
elif self.state == "decreasing":
if self.v_target >= self.v_cruise_cluster or self.v_cruise_cluster <= self.v_cruise_min:
self.state = "holding"
elif self.is_ready and not self.is_ready_prev:
self.pre_active_timer = int(INACTIVE_TIMER / DT_CTRL)
self.state = "preActive"
self.state = desired_state
elif self.state == "holding":
if desired_state != "holding":
self._arm_pre_active(desired_state)
elif self.state != desired_state:
if desired_state == "holding":
self.state = "holding"
else:
self._arm_pre_active(desired_state)
return self._send_button_for_state(self.state)
+73
View File
@@ -55,6 +55,7 @@ class TestVCruiseHelper:
cruise_increase=1,
cruise_increase_long=5,
is_metric=False,
reverse_cruise_increase=False,
set_speed_limit=False,
)
self.reset_cruise_speed_state()
@@ -304,3 +305,75 @@ class TestVCruiseHelper:
)
assert self.v_cruise_helper.v_cruise_kph == pytest.approx(initial_v_cruise_kph + IMPERIAL_INCREMENT)
class TestVCruiseHelperRedneck:
def setup_method(self):
self.CP = car.CarParams(pcmCruise=True)
self.FPCP = SimpleNamespace(pcmCruiseSpeed=False, redneckCruiseAvailable=True)
self.v_cruise_helper = VCruiseHelper(self.CP, self.FPCP)
self.starpilot_toggles = SimpleNamespace(
cruise_increase=1,
cruise_increase_long=5,
is_metric=False,
reverse_cruise_increase=False,
set_speed_limit=False,
)
def test_initialize_v_cruise_uses_cluster_speed(self):
cs = car.CarState(
vEgo=55 * CV.MPH_TO_MS,
cruiseState={"speedCluster": 62 * CV.MPH_TO_MS},
)
self.v_cruise_helper.initialize_v_cruise(cs, experimental_mode=False, resume_prev_button=False,
starpilot_toggles=self.starpilot_toggles)
assert self.v_cruise_helper.v_cruise_kph == pytest.approx(62 * CV.MPH_TO_KPH)
assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(62 * CV.MPH_TO_KPH)
def test_update_v_cruise_does_not_follow_stock_pcm_speed(self):
cs = car.CarState(
vEgo=55 * CV.MPH_TO_MS,
cruiseState={"speedCluster": 62 * CV.MPH_TO_MS},
)
self.v_cruise_helper.initialize_v_cruise(cs, experimental_mode=False, resume_prev_button=False,
starpilot_toggles=self.starpilot_toggles)
update_cs = car.CarState(
cruiseState={"available": True, "speed": 50 * CV.MPH_TO_MS, "speedCluster": 50 * CV.MPH_TO_MS},
)
self.v_cruise_helper.update_v_cruise(update_cs, enabled=True, is_metric=False,
speed_limit_changed=False, starpilot_toggles=self.starpilot_toggles)
assert self.v_cruise_helper.v_cruise_kph == pytest.approx(62 * CV.MPH_TO_KPH)
assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(62 * CV.MPH_TO_KPH)
def test_reverse_cruise_increase_swaps_short_and_long_press_intervals(self):
self.enable(55 * CV.MPH_TO_MS, experimental_mode=False)
initial_v_cruise_kph = self.v_cruise_helper.v_cruise_kph
self.starpilot_toggles.cruise_increase = 1
self.starpilot_toggles.cruise_increase_long = 5
self.starpilot_toggles.reverse_cruise_increase = True
pressed_cs = car.CarState(cruiseState={"available": True})
pressed_cs.buttonEvents = [ButtonEvent(type=ButtonType.accelCruise, pressed=True)]
self.v_cruise_helper.update_v_cruise(
pressed_cs,
enabled=True,
is_metric=False,
speed_limit_changed=False,
starpilot_toggles=self.starpilot_toggles,
)
released_cs = car.CarState(cruiseState={"available": True})
released_cs.buttonEvents = [ButtonEvent(type=ButtonType.accelCruise, pressed=False)]
self.v_cruise_helper.update_v_cruise(
released_cs,
enabled=True,
is_metric=False,
speed_limit_changed=False,
starpilot_toggles=self.starpilot_toggles,
)
reversed_interval = 5 * IMPERIAL_INCREMENT
expected_kph = math.ceil(initial_v_cruise_kph / reversed_interval) * reversed_interval
assert self.v_cruise_helper.v_cruise_kph == pytest.approx(expected_kph)
+46 -2
View File
@@ -5,11 +5,13 @@ from cereal import car
from openpilot.common.constants import CV
from openpilot.common.realtime import DT_CTRL
from openpilot.selfdrive.car.redneck_cruise import (
INACTIVE_TIMER,
DECREASE_INACTIVE_TIMER,
INCREASE_INACTIVE_TIMER,
RedneckCruise,
SEND_BUTTON_DECREASE,
SEND_BUTTON_INCREASE,
SEND_BUTTON_NONE,
select_redneck_target_speed,
)
@@ -40,7 +42,7 @@ class TestRedneckCruise(unittest.TestCase):
return SimpleNamespace(type=button_type, pressed=pressed)
def _run_until_active(self, target_mph, speed_cluster_mph=20.0, button_events=None, override=False, cancel=False, resume=False):
frames = int(INACTIVE_TIMER / DT_CTRL) + 2
frames = int(max(INCREASE_INACTIVE_TIMER, DECREASE_INACTIVE_TIMER) / DT_CTRL) + 2
send_button = SEND_BUTTON_NONE
v_target = 0
for _ in range(frames):
@@ -53,6 +55,19 @@ class TestRedneckCruise(unittest.TestCase):
button_events = None
return send_button, v_target
def _frames_until_button(self, target_mph, speed_cluster_mph):
frames = int(INCREASE_INACTIVE_TIMER / DT_CTRL) + 4
for frame in range(frames):
send_button, _ = self.redneck.run(
self._new_state(speed_cluster_mph=speed_cluster_mph),
self._new_control(),
target_mph * CV.MPH_TO_MS,
is_metric=False,
)
if send_button != SEND_BUTTON_NONE:
return frame
return None
def test_increases_cluster_speed_toward_target(self):
send_button, v_target = self._run_until_active(target_mph=25.0, speed_cluster_mph=20.0)
self.assertEqual(SEND_BUTTON_INCREASE, send_button)
@@ -63,6 +78,15 @@ class TestRedneckCruise(unittest.TestCase):
self.assertEqual(SEND_BUTTON_DECREASE, send_button)
self.assertEqual(20, v_target)
def test_decrease_activates_faster_than_increase(self):
decrease_frame = self._frames_until_button(target_mph=20.0, speed_cluster_mph=25.0)
self.redneck = RedneckCruise(self.CP, self.FPCP)
increase_frame = self._frames_until_button(target_mph=25.0, speed_cluster_mph=20.0)
self.assertIsNotNone(decrease_frame)
self.assertIsNotNone(increase_frame)
self.assertLess(decrease_frame, increase_frame)
def test_suppresses_output_during_manual_cruise_button_use(self):
button_event = self._button_event(ButtonType.accelCruise, True)
send_button, _ = self._run_until_active(target_mph=25.0, speed_cluster_mph=20.0, button_events=[button_event])
@@ -85,6 +109,26 @@ class TestRedneckCruise(unittest.TestCase):
self.assertEqual(SEND_BUTTON_NONE, send_button)
self.assertEqual(0, v_target)
def test_target_speed_returns_internal_max_when_plan_only_wants_to_speed_back_up(self):
target_speed = select_redneck_target_speed(
120.0,
77.0 * CV.MPH_TO_MS,
0.0,
[78.3 * CV.MPH_TO_MS, 78.2 * CV.MPH_TO_MS, 78.1 * CV.MPH_TO_MS],
10,
)
self.assertAlmostEqual(120.0 * CV.KPH_TO_MS, target_speed)
def test_target_speed_returns_plan_minimum_when_slowing_down(self):
target_speed = select_redneck_target_speed(
120.0,
75.0 * CV.MPH_TO_MS,
0.0,
[74.0 * CV.MPH_TO_MS, 72.0 * CV.MPH_TO_MS, 71.0 * CV.MPH_TO_MS],
10,
)
self.assertAlmostEqual(71.0 * CV.MPH_TO_MS, target_speed)
if __name__ == "__main__":
unittest.main()
+27 -3
View File
@@ -14,6 +14,8 @@ LANE_CHANGE_SPEED_MIN = 20 * CV.MPH_TO_MS
LANE_CHANGE_TIME_MAX = 10.
NAV_TURN_DISTANCE_SPEED_BREAKPOINTS = [0.0, 5.0, 10.0]
NAV_TURN_DISTANCE_BREAKPOINTS = [20.0, 25.0, 30.0]
NAV_KEEP_DISTANCE_SPEED_BREAKPOINTS = [0.0, 15.0, 30.0]
NAV_KEEP_DISTANCE_BREAKPOINTS = [25.0, 90.0, 160.0]
DESIRES = {
LaneChangeDirection.none: {
@@ -116,17 +118,39 @@ class DesireHelper:
return distance <= float(np.interp(carstate.vEgo, NAV_TURN_DISTANCE_SPEED_BREAKPOINTS, NAV_TURN_DISTANCE_BREAKPOINTS))
@staticmethod
def _nav_keep_is_imminent(carstate, maneuver_distance):
try:
distance = float(maneuver_distance)
except (TypeError, ValueError):
return False
return distance <= float(np.interp(carstate.vEgo, NAV_KEEP_DISTANCE_SPEED_BREAKPOINTS, NAV_KEEP_DISTANCE_BREAKPOINTS))
@staticmethod
def _nav_effective_modifier(nav_instruction_state, carstate, maneuver_distance):
modifier = str(nav_instruction_state.get("maneuverModifier", ""))
maneuver_type = str(nav_instruction_state.get("maneuverType", ""))
active_lane_direction = str(nav_instruction_state.get("activeLaneDirection", ""))
if modifier in ("left", "right") and maneuver_type in ("off ramp", "fork") and DesireHelper._nav_keep_is_imminent(carstate, maneuver_distance):
if active_lane_direction in ("slightLeft", "left"):
return "slightLeft"
if active_lane_direction in ("slightRight", "right"):
return "slightRight"
return modifier
def _navigation_desire(self, carstate, lateral_active, starpilotPlan, starpilot_toggles):
self._update_nav_params()
if not self.nav_desires_allowed or not lateral_active or not bool(self._nav_instruction_state.get("valid", False)):
return log.Desire.none
modifier = str(self._nav_instruction_state.get("maneuverModifier", ""))
maneuver_distance = self._nav_instruction_state.get("maneuverDistance", 0.0)
modifier = self._nav_effective_modifier(self._nav_instruction_state, carstate, maneuver_distance)
if modifier == "":
return log.Desire.none
maneuver_distance = self._nav_instruction_state.get("maneuverDistance", 0.0)
if modifier == "slightLeft":
lane_change_direction = LaneChangeDirection.left
desired_lane_width = starpilotPlan.laneWidthLeft
+213 -28
View File
@@ -113,6 +113,10 @@ VOLT_STANDARD_CARS = (
GENESIS_G90_CARS = (
HYUNDAI_CAR.GENESIS_G90,
)
PALISADE_CARS = (
HYUNDAI_CAR.HYUNDAI_PALISADE,
HYUNDAI_CAR.HYUNDAI_PALISADE_2023,
)
IONIQ_5_CARS = (
HYUNDAI_CAR.HYUNDAI_IONIQ_5,
)
@@ -126,6 +130,9 @@ IONIQ_6_CARS = (
SONATA_HYBRID_CARS = (
HYUNDAI_CAR.HYUNDAI_SONATA_HYBRID,
)
SONATA_CARS = (
HYUNDAI_CAR.HYUNDAI_SONATA,
)
ELANTRA_NON_SCC_CARS = (
HYUNDAI_CAR.HYUNDAI_ELANTRA_2022_NON_SCC,
HYUNDAI_CAR.HYUNDAI_ELANTRA_HEV_2022_NON_SCC,
@@ -268,6 +275,29 @@ SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_LAT_WIDTH = 0.02
SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_SPEED_MAX = 7.5
SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_SPEED_WIDTH = 1.0
SONATA_FF_REDUCTION_LEFT = 0.04
SONATA_FF_REDUCTION_RIGHT = 0.26
SONATA_FF_ONSET = 0.18
SONATA_FF_ONSET_WIDTH = 0.08
SONATA_FF_CUTOFF = 1.40
SONATA_FF_CUTOFF_WIDTH = 0.42
SONATA_TRANSITION_SPEED = 8.5
SONATA_PHASE_SCALE = 0.12
SONATA_TURN_IN_BOOST_LEFT = 0.18
SONATA_TURN_IN_BOOST_RIGHT = 0.00
SONATA_UNWIND_TAPER_LEFT = 0.28
SONATA_UNWIND_TAPER_RIGHT = 0.00
SONATA_CENTER_TAPER_MAX = 0.04
SONATA_CENTER_TAPER_LAT = 0.15
SONATA_CENTER_TAPER_LAT_WIDTH = 0.025
SONATA_CENTER_TAPER_SPEED = 22.0
SONATA_CENTER_TAPER_SPEED_WIDTH = 2.5
SONATA_LOW_SPEED_CENTER_TAPER_MAX = 0.08
SONATA_LOW_SPEED_CENTER_TAPER_LAT = 0.10
SONATA_LOW_SPEED_CENTER_TAPER_LAT_WIDTH = 0.02
SONATA_LOW_SPEED_CENTER_TAPER_SPEED_MAX = 7.0
SONATA_LOW_SPEED_CENTER_TAPER_SPEED_WIDTH = 1.0
ELANTRA_NON_SCC_FF_ADJUST_LEFT = 0.02
ELANTRA_NON_SCC_FF_ADJUST_RIGHT = -0.02
ELANTRA_NON_SCC_FF_ONSET = 0.14
@@ -300,6 +330,31 @@ KIA_FORTE_CENTER_TAPER_LAT_WIDTH = 0.03
KIA_FORTE_CENTER_TAPER_SPEED = 24.0
KIA_FORTE_CENTER_TAPER_SPEED_WIDTH = 2.5
PALISADE_BASE_LAT_ACCEL_FACTOR_MULT = 0.98
PALISADE_FF_GAIN_LEFT = 0.14
PALISADE_FF_GAIN_RIGHT = 0.12
PALISADE_FF_ONSET = 0.08
PALISADE_FF_ONSET_WIDTH = 0.04
PALISADE_FF_CUTOFF = 1.25
PALISADE_FF_CUTOFF_WIDTH = 0.36
PALISADE_TRANSITION_SPEED = 9.0
PALISADE_PHASE_SCALE = 0.11
PALISADE_TURN_IN_BOOST_LEFT = 0.34
PALISADE_TURN_IN_BOOST_RIGHT = 0.24
PALISADE_UNWIND_TAPER_LEFT = 0.18
PALISADE_UNWIND_TAPER_RIGHT = 0.30
PALISADE_FRICTION_MULT = 1.02
PALISADE_FRICTION_LAT_RISE = 0.20
PALISADE_FRICTION_JERK_RISE = 0.24
PALISADE_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.18
PALISADE_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.14
PALISADE_UNWIND_THRESHOLD_INCREASE_LEFT = 0.14
PALISADE_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.22
PALISADE_TURN_IN_FRICTION_BOOST_LEFT = 0.08
PALISADE_TURN_IN_FRICTION_BOOST_RIGHT = 0.06
PALISADE_UNWIND_FRICTION_REDUCTION_LEFT = 0.12
PALISADE_UNWIND_FRICTION_REDUCTION_RIGHT = 0.20
GENESIS_G90_LATERAL_TESTING_GROUND_ID = testing_ground.id_4
GENESIS_G90_FF_GAIN_LEFT = 0.32
GENESIS_G90_FF_GAIN_RIGHT = 0.16
@@ -330,26 +385,26 @@ IONIQ_5_FF_ONSET = 0.10
IONIQ_5_FF_ONSET_WIDTH = 0.05
IONIQ_5_FF_CUTOFF = 1.20
IONIQ_5_FF_CUTOFF_WIDTH = 0.30
IONIQ_5_TRANSITION_SPEED = 11.0
IONIQ_5_TRANSITION_SPEED = 12.5
IONIQ_5_PHASE_SCALE = 0.10
IONIQ_5_FF_REDUCTION_LEFT = 0.14
IONIQ_5_FF_REDUCTION_RIGHT = 0.18
IONIQ_5_TURN_IN_BOOST_LEFT = 0.04
IONIQ_5_TURN_IN_BOOST_RIGHT = 0.00
IONIQ_5_UNWIND_TAPER_LEFT = 0.52
IONIQ_5_UNWIND_TAPER_RIGHT = 0.82
IONIQ_5_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.05
IONIQ_5_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.00
IONIQ_5_UNWIND_THRESHOLD_INCREASE_LEFT = 0.24
IONIQ_5_FF_REDUCTION_LEFT = 0.12
IONIQ_5_FF_REDUCTION_RIGHT = 0.22
IONIQ_5_TURN_IN_BOOST_LEFT = 0.14
IONIQ_5_TURN_IN_BOOST_RIGHT = 0.06
IONIQ_5_UNWIND_TAPER_LEFT = 0.76
IONIQ_5_UNWIND_TAPER_RIGHT = 0.86
IONIQ_5_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.08
IONIQ_5_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.05
IONIQ_5_UNWIND_THRESHOLD_INCREASE_LEFT = 0.36
IONIQ_5_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.38
IONIQ_5_TURN_IN_FRICTION_BOOST_LEFT = 0.02
IONIQ_5_TURN_IN_FRICTION_BOOST_RIGHT = 0.00
IONIQ_5_UNWIND_FRICTION_REDUCTION_LEFT = 0.22
IONIQ_5_UNWIND_FRICTION_REDUCTION_RIGHT = 0.32
IONIQ_5_CENTER_TAPER_MAX = 0.08
IONIQ_5_CENTER_TAPER_LAT = 0.16
IONIQ_5_TURN_IN_FRICTION_BOOST_LEFT = 0.04
IONIQ_5_TURN_IN_FRICTION_BOOST_RIGHT = 0.03
IONIQ_5_UNWIND_FRICTION_REDUCTION_LEFT = 0.34
IONIQ_5_UNWIND_FRICTION_REDUCTION_RIGHT = 0.34
IONIQ_5_CENTER_TAPER_MAX = 0.14
IONIQ_5_CENTER_TAPER_LAT = 0.12
IONIQ_5_CENTER_TAPER_LAT_WIDTH = 0.03
IONIQ_5_CENTER_TAPER_SPEED = 20.0
IONIQ_5_CENTER_TAPER_SPEED = 16.0
IONIQ_5_CENTER_TAPER_SPEED_WIDTH = 2.5
IONIQ_EV_OLD_BASE_LAT_ACCEL_FACTOR_MULT = 1.16
@@ -443,29 +498,29 @@ IONIQ_6_OUTPUT_DIRECTIONAL_TAPER_BLEND = 0.97
KIA_EV6_LATERAL_TESTING_GROUND_ID = testing_ground.id_6
KIA_EV6_LATERAL_TESTING_GROUND_VARIANT = "C"
KIA_EV6_FF_GAIN_LEFT = 0.07
KIA_EV6_FF_GAIN_RIGHT = 0.075
KIA_EV6_FF_GAIN_LEFT = 0.06
KIA_EV6_FF_GAIN_RIGHT = 0.07
KIA_EV6_FF_ONSET = 0.08
KIA_EV6_FF_ONSET_WIDTH = 0.04
KIA_EV6_FF_CUTOFF = 0.60
KIA_EV6_FF_CUTOFF_WIDTH = 0.14
KIA_EV6_TRANSITION_SPEED = 11.0
KIA_EV6_PHASE_SCALE = 0.09
KIA_EV6_TURN_IN_BOOST_LEFT = 0.14
KIA_EV6_TURN_IN_BOOST_RIGHT = 0.16
KIA_EV6_UNWIND_TAPER_LEFT = 0.40
KIA_EV6_UNWIND_TAPER_RIGHT = 0.36
KIA_EV6_TURN_IN_BOOST_LEFT = 0.18
KIA_EV6_TURN_IN_BOOST_RIGHT = 0.12
KIA_EV6_UNWIND_TAPER_LEFT = 0.48
KIA_EV6_UNWIND_TAPER_RIGHT = 0.46
KIA_EV6_FRICTION_MULT = 1.01
KIA_EV6_FRICTION_LAT_RISE = 0.18
KIA_EV6_FRICTION_JERK_RISE = 0.22
KIA_EV6_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.10
KIA_EV6_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.14
KIA_EV6_UNWIND_THRESHOLD_INCREASE_LEFT = 0.22
KIA_EV6_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.18
KIA_EV6_TURN_IN_FRICTION_BOOST_LEFT = 0.03
KIA_EV6_UNWIND_THRESHOLD_INCREASE_LEFT = 0.28
KIA_EV6_UNWIND_THRESHOLD_INCREASE_RIGHT = 0.24
KIA_EV6_TURN_IN_FRICTION_BOOST_LEFT = 0.04
KIA_EV6_TURN_IN_FRICTION_BOOST_RIGHT = 0.05
KIA_EV6_UNWIND_FRICTION_REDUCTION_LEFT = 0.22
KIA_EV6_UNWIND_FRICTION_REDUCTION_RIGHT = 0.16
KIA_EV6_UNWIND_FRICTION_REDUCTION_LEFT = 0.28
KIA_EV6_UNWIND_FRICTION_REDUCTION_RIGHT = 0.22
KIA_EV6_CENTER_TAPER_MAX = 0.08
KIA_EV6_CENTER_TAPER_LAT = 0.16
KIA_EV6_CENTER_TAPER_LAT_WIDTH = 0.035
@@ -993,6 +1048,53 @@ def get_sonata_hybrid_center_taper_scale(desired_lateral_accel: float, v_ego: fl
return 1.0 - reduction
def _sonata_sigmoid(x: float) -> float:
return _sigmoid(x)
def _sonata_low_speed_factor(v_ego: float) -> float:
return 1.0 / (1.0 + (max(v_ego, 0.0) / SONATA_TRANSITION_SPEED) ** 2)
def _sonata_transition_phase(desired_lateral_accel: float, desired_lateral_jerk: float) -> float:
return math.tanh((desired_lateral_accel * desired_lateral_jerk) / SONATA_PHASE_SCALE)
def _sonata_side_value(desired_lateral_accel: float, left_value: float, right_value: float) -> float:
return left_value if desired_lateral_accel >= 0.0 else right_value
def get_sonata_ff_scale(desired_lateral_accel: float, desired_lateral_jerk: float, v_ego: float) -> float:
if desired_lateral_accel == 0.0:
return 1.0
abs_lateral_accel = abs(desired_lateral_accel)
onset = _sonata_sigmoid((abs_lateral_accel - SONATA_FF_ONSET) / SONATA_FF_ONSET_WIDTH)
cutoff = _sonata_sigmoid((SONATA_FF_CUTOFF - abs_lateral_accel) / SONATA_FF_CUTOFF_WIDTH)
base_reduction = _sonata_side_value(desired_lateral_accel, SONATA_FF_REDUCTION_LEFT, SONATA_FF_REDUCTION_RIGHT) * onset * cutoff
phase = _sonata_transition_phase(desired_lateral_accel, desired_lateral_jerk)
turn_in_weight = max(phase, 0.0)
unwind_weight = max(-phase, 0.0)
low_speed_factor = _sonata_low_speed_factor(v_ego)
turn_in_boost = 1.0 + (_sonata_side_value(desired_lateral_accel, SONATA_TURN_IN_BOOST_LEFT, SONATA_TURN_IN_BOOST_RIGHT) *
turn_in_weight * low_speed_factor)
unwind_taper = 1.0 - (_sonata_side_value(desired_lateral_accel, SONATA_UNWIND_TAPER_LEFT, SONATA_UNWIND_TAPER_RIGHT) *
unwind_weight * (0.35 + 0.65 * low_speed_factor))
return (1.0 - base_reduction) * turn_in_boost * max(unwind_taper, 0.0)
def get_sonata_center_taper_scale(desired_lateral_accel: float, v_ego: float) -> float:
speed_weight = _sonata_sigmoid((v_ego - SONATA_CENTER_TAPER_SPEED) / SONATA_CENTER_TAPER_SPEED_WIDTH)
center_weight = _sonata_sigmoid((SONATA_CENTER_TAPER_LAT - abs(desired_lateral_accel)) / SONATA_CENTER_TAPER_LAT_WIDTH)
reduction = SONATA_CENTER_TAPER_MAX * speed_weight * center_weight
low_speed_weight = _sonata_sigmoid((SONATA_LOW_SPEED_CENTER_TAPER_SPEED_MAX - v_ego) /
SONATA_LOW_SPEED_CENTER_TAPER_SPEED_WIDTH)
low_speed_center_weight = _sonata_sigmoid((SONATA_LOW_SPEED_CENTER_TAPER_LAT - abs(desired_lateral_accel)) /
SONATA_LOW_SPEED_CENTER_TAPER_LAT_WIDTH)
reduction += SONATA_LOW_SPEED_CENTER_TAPER_MAX * low_speed_weight * low_speed_center_weight
return 1.0 - reduction
def _elantra_non_scc_sigmoid(x: float) -> float:
return _sigmoid(x)
@@ -1077,6 +1179,74 @@ def get_kia_forte_center_taper_scale(desired_lateral_accel: float, v_ego: float)
return 1.0 - reduction
def _palisade_sigmoid(x: float) -> float:
return _sigmoid(x)
def _palisade_low_speed_factor(v_ego: float) -> float:
return 1.0 / (1.0 + (max(v_ego, 0.0) / PALISADE_TRANSITION_SPEED) ** 2)
def _palisade_transition_phase(desired_lateral_accel: float, desired_lateral_jerk: float) -> float:
return math.tanh((desired_lateral_accel * desired_lateral_jerk) / PALISADE_PHASE_SCALE)
def _palisade_side_value(desired_lateral_accel: float, left_value: float, right_value: float) -> float:
return left_value if desired_lateral_accel >= 0.0 else right_value
def _palisade_transition_envelope(v_ego: float, desired_lateral_accel: float, desired_lateral_jerk: float) -> float:
lat_factor = 1.0 - math.exp(-abs(desired_lateral_accel) / PALISADE_FRICTION_LAT_RISE)
jerk_factor = 1.0 - math.exp(-abs(desired_lateral_jerk) / PALISADE_FRICTION_JERK_RISE)
return _palisade_low_speed_factor(v_ego) * lat_factor * jerk_factor
def get_palisade_ff_scale(desired_lateral_accel: float, desired_lateral_jerk: float, v_ego: float) -> float:
if desired_lateral_accel == 0.0:
return 1.0
gain = _palisade_side_value(desired_lateral_accel, PALISADE_FF_GAIN_LEFT, PALISADE_FF_GAIN_RIGHT)
abs_lateral_accel = abs(desired_lateral_accel)
onset = _palisade_sigmoid((abs_lateral_accel - PALISADE_FF_ONSET) / PALISADE_FF_ONSET_WIDTH)
cutoff = _palisade_sigmoid((PALISADE_FF_CUTOFF - abs_lateral_accel) / PALISADE_FF_CUTOFF_WIDTH)
extra_scale = gain * onset * cutoff
phase = _palisade_transition_phase(desired_lateral_accel, desired_lateral_jerk)
turn_in_weight = max(phase, 0.0)
unwind_weight = max(-phase, 0.0)
low_speed_factor = _palisade_low_speed_factor(v_ego)
turn_in_boost = 1.0 + (_palisade_side_value(desired_lateral_accel, PALISADE_TURN_IN_BOOST_LEFT, PALISADE_TURN_IN_BOOST_RIGHT) *
turn_in_weight * (0.35 + 0.65 * low_speed_factor))
unwind_taper = 1.0 - (_palisade_side_value(desired_lateral_accel, PALISADE_UNWIND_TAPER_LEFT, PALISADE_UNWIND_TAPER_RIGHT) *
unwind_weight * (0.35 + 0.65 * low_speed_factor))
return 1.0 + (extra_scale * turn_in_boost * max(unwind_taper, 0.0))
def get_palisade_friction_threshold(v_ego: float, desired_lateral_accel: float = 0.0, desired_lateral_jerk: float = 0.0) -> float:
base_threshold = get_friction_threshold(v_ego)
transition_envelope = _palisade_transition_envelope(v_ego, desired_lateral_accel, desired_lateral_jerk)
phase = _palisade_transition_phase(desired_lateral_accel, desired_lateral_jerk)
turn_in_weight = max(phase, 0.0)
unwind_weight = max(-phase, 0.0)
threshold_scale = 1.0 - (_palisade_side_value(desired_lateral_accel, PALISADE_TURN_IN_THRESHOLD_REDUCTION_LEFT, PALISADE_TURN_IN_THRESHOLD_REDUCTION_RIGHT) *
transition_envelope * turn_in_weight)
threshold_scale += (_palisade_side_value(desired_lateral_accel, PALISADE_UNWIND_THRESHOLD_INCREASE_LEFT, PALISADE_UNWIND_THRESHOLD_INCREASE_RIGHT) *
transition_envelope * unwind_weight)
return base_threshold * min(max(threshold_scale, 0.84), 1.14)
def get_palisade_friction_scale(v_ego: float, desired_lateral_accel: float, desired_lateral_jerk: float) -> float:
transition_envelope = _palisade_transition_envelope(v_ego, desired_lateral_accel, desired_lateral_jerk)
phase = _palisade_transition_phase(desired_lateral_accel, desired_lateral_jerk)
turn_in_weight = max(phase, 0.0)
unwind_weight = max(-phase, 0.0)
friction_scale = PALISADE_FRICTION_MULT
friction_scale += (_palisade_side_value(desired_lateral_accel, PALISADE_TURN_IN_FRICTION_BOOST_LEFT, PALISADE_TURN_IN_FRICTION_BOOST_RIGHT) *
transition_envelope * turn_in_weight)
friction_scale -= (_palisade_side_value(desired_lateral_accel, PALISADE_UNWIND_FRICTION_REDUCTION_LEFT, PALISADE_UNWIND_FRICTION_REDUCTION_RIGHT) *
transition_envelope * unwind_weight)
return min(max(friction_scale, 0.92), 1.12)
def genesis_g90_lateral_testing_ground_active() -> bool:
return testing_ground.use(GENESIS_G90_LATERAL_TESTING_GROUND_ID)
@@ -1577,9 +1747,11 @@ class LatControlTorque(LatControl):
self.is_bolt_2017 = CP.carFingerprint in BOLT_2017_CARS
self.is_volt_standard = CP.carFingerprint in VOLT_STANDARD_CARS
self.is_genesis_g90 = CP.carFingerprint in GENESIS_G90_CARS
self.is_palisade = CP.carFingerprint in PALISADE_CARS
self.is_ioniq_5 = CP.carFingerprint in IONIQ_5_CARS
self.is_ioniq_ev_old = CP.carFingerprint in IONIQ_EV_OLD_CARS
self.is_ioniq_6 = CP.carFingerprint in IONIQ_6_CARS
self.is_sonata = CP.carFingerprint in SONATA_CARS
self.is_sonata_hybrid = CP.carFingerprint in SONATA_HYBRID_CARS
self.is_elantra_non_scc = CP.carFingerprint in ELANTRA_NON_SCC_CARS
self.is_kia_forte = CP.carFingerprint in KIA_FORTE_CARS
@@ -1593,6 +1765,8 @@ class LatControlTorque(LatControl):
self.torque_ff_scale_neg = 1.0
self.torque_deadzone_boost = float(getattr(self.torque_params, "kfDEPRECATED", 0.0))
self.torque_ki_mult = 1.0
if self.is_palisade:
self.torque_params.latAccelFactor *= PALISADE_BASE_LAT_ACCEL_FACTOR_MULT
if self.is_ioniq_5:
self.torque_params.latAccelFactor *= IONIQ_5_BASE_LAT_ACCEL_FACTOR_MULT
if self.is_ioniq_ev_old:
@@ -1620,6 +1794,8 @@ class LatControlTorque(LatControl):
self.pid._k_i = [self.pid._k_i[0], [k * self.torque_ki_mult for k in self.pid._k_i[1]]]
def update_live_torque_params(self, latAccelFactor, latAccelOffset, friction):
if self.is_palisade:
latAccelFactor *= PALISADE_BASE_LAT_ACCEL_FACTOR_MULT
if self.is_ioniq_5:
latAccelFactor *= IONIQ_5_BASE_LAT_ACCEL_FACTOR_MULT
if self.is_ioniq_ev_old:
@@ -1703,9 +1879,11 @@ class LatControlTorque(LatControl):
bolt_2018_2021_tuned_path_active = self.is_bolt_2018_2021
volt_standard_test_active = self.is_volt_standard and volt_standard_lateral_testing_ground_active()
genesis_g90_test_active = self.is_genesis_g90 and genesis_g90_lateral_testing_ground_active()
palisade_active = self.is_palisade
ioniq_5_active = self.is_ioniq_5
ioniq_ev_old_active = self.is_ioniq_ev_old
ioniq_6_active = self.is_ioniq_6
sonata_active = self.is_sonata
sonata_hybrid_active = self.is_sonata_hybrid
elantra_non_scc_active = self.is_elantra_non_scc
kia_forte_active = self.is_kia_forte
@@ -1715,6 +1893,7 @@ class LatControlTorque(LatControl):
volt_standard_center_taper = get_volt_standard_center_taper_scale(setpoint, CS.vEgo) if volt_standard_test_active else 1.0
ioniq_ev_old_center_taper = get_ioniq_ev_old_center_taper_scale(setpoint, CS.vEgo) if ioniq_ev_old_active else 1.0
ioniq_6_center_taper = get_ioniq_6_center_taper_scale(setpoint, CS.vEgo) if ioniq_6_active else 1.0
sonata_center_taper = get_sonata_center_taper_scale(setpoint, CS.vEgo) if sonata_active else 1.0
sonata_hybrid_center_taper = get_sonata_hybrid_center_taper_scale(setpoint, CS.vEgo) if sonata_hybrid_active else 1.0
kia_forte_center_taper = get_kia_forte_center_taper_scale(setpoint, CS.vEgo) if kia_forte_active else 1.0
kia_ev6_center_taper = get_kia_ev6_center_taper_scale(setpoint, CS.vEgo) if kia_ev6_test_active else 1.0
@@ -1739,6 +1918,10 @@ class LatControlTorque(LatControl):
ff *= get_genesis_g90_ff_scale(setpoint, desired_lateral_jerk, CS.vEgo)
friction_threshold = get_genesis_g90_friction_threshold(CS.vEgo, setpoint, desired_lateral_jerk)
friction_scale = get_genesis_g90_friction_scale(CS.vEgo, setpoint, desired_lateral_jerk)
elif palisade_active:
ff *= get_palisade_ff_scale(setpoint, desired_lateral_jerk, CS.vEgo)
friction_threshold = get_palisade_friction_threshold(CS.vEgo, setpoint, desired_lateral_jerk)
friction_scale = get_palisade_friction_scale(CS.vEgo, setpoint, desired_lateral_jerk)
elif ioniq_5_active:
ff *= get_ioniq_5_ff_scale(setpoint, desired_lateral_jerk, CS.vEgo) * ioniq_5_center_taper
friction_threshold = get_ioniq_5_friction_threshold(CS.vEgo, setpoint, desired_lateral_jerk)
@@ -1752,6 +1935,8 @@ class LatControlTorque(LatControl):
friction_threshold = get_ioniq_6_friction_threshold(CS.vEgo, setpoint, desired_lateral_jerk) / max(ioniq_6_center_taper, 1e-3)
friction_scale = get_ioniq_6_friction_scale(CS.vEgo, setpoint, desired_lateral_jerk)
friction_scale = 1.0 + ((friction_scale - 1.0) * ioniq_6_center_taper)
elif sonata_active:
ff *= get_sonata_ff_scale(setpoint, desired_lateral_jerk, CS.vEgo) * sonata_center_taper
elif sonata_hybrid_active:
ff *= get_sonata_hybrid_ff_scale(setpoint, desired_lateral_jerk, CS.vEgo) * sonata_hybrid_center_taper
elif elantra_non_scc_active:
@@ -79,6 +79,13 @@ FAR_RADAR_LEAD_ACCEL_TAPER_FULL_GAP_EXCESS = 25.0
FAR_RADAR_LEAD_ACCEL_TAPER_FULL_GAP_GAIN = 0.9
RADARLESS_MATCHED_FOLLOW_CRUISE_HYSTERESIS_MIN = 2.5
RADARLESS_MATCHED_FOLLOW_CRUISE_HYSTERESIS_GAIN = 0.10
NEAR_DUPLICATE_LEAD_SOURCE_MIN_SPEED = 20.0
NEAR_DUPLICATE_LEAD_SOURCE_MIN_MODEL_PROB = 0.9
NEAR_DUPLICATE_LEAD_SOURCE_MAX_LEAD_BRAKE = 0.35
NEAR_DUPLICATE_LEAD_SOURCE_MAX_DREL_DIFF = 1.5
NEAR_DUPLICATE_LEAD_SOURCE_MAX_VREL_DIFF = 0.35
NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MIN = 0.75
NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MAX = 1.5
# Function to get parameter value based on current speed
def get_speed_based_param(speed_mph, param_array):
@@ -492,9 +499,9 @@ class LongitudinalMpc:
# Adjust filter time constants for complex scenes
if abs(filter_time_factor - getattr(self, 'prev_filter_time_factor', 1.0)) > 0.05:
new_filter_time = self.current_filter_time * filter_time_factor
current_a = self.lead_a_filter.x if hasattr(self.lead_a_filter, 'x') else 0.0
current_v = self.lead_v_filter.x if hasattr(self.lead_v_filter, 'x') else 0.0
new_filter_time = self.current_filter_time * filter_time_factor
self.lead_a_filter = FirstOrderFilter(current_a, new_filter_time, self.dt)
self.lead_v_filter = FirstOrderFilter(current_v, new_filter_time, self.dt)
self.prev_filter_time_factor = filter_time_factor
@@ -583,6 +590,43 @@ class LongitudinalMpc:
return max(RADARLESS_MATCHED_FOLLOW_CRUISE_HYSTERESIS_MIN,
RADARLESS_MATCHED_FOLLOW_CRUISE_HYSTERESIS_GAIN * float(v_ego))
@staticmethod
def leads_are_near_duplicates(lead_one, lead_two, v_ego):
if lead_one is None or lead_two is None or not lead_one.status or not lead_two.status:
return False
if float(v_ego) < NEAR_DUPLICATE_LEAD_SOURCE_MIN_SPEED:
return False
if bool(getattr(lead_one, "radar", False)) or bool(getattr(lead_two, "radar", False)):
return False
if float(getattr(lead_one, "modelProb", 0.0)) < NEAR_DUPLICATE_LEAD_SOURCE_MIN_MODEL_PROB:
return False
if float(getattr(lead_two, "modelProb", 0.0)) < NEAR_DUPLICATE_LEAD_SOURCE_MIN_MODEL_PROB:
return False
if max(0.0, -float(getattr(lead_one, "aLeadK", 0.0))) > NEAR_DUPLICATE_LEAD_SOURCE_MAX_LEAD_BRAKE:
return False
if max(0.0, -float(getattr(lead_two, "aLeadK", 0.0))) > NEAR_DUPLICATE_LEAD_SOURCE_MAX_LEAD_BRAKE:
return False
return (
abs(float(lead_one.dRel) - float(lead_two.dRel)) <= NEAR_DUPLICATE_LEAD_SOURCE_MAX_DREL_DIFF and
abs(float(lead_one.vRel) - float(lead_two.vRel)) <= NEAR_DUPLICATE_LEAD_SOURCE_MAX_VREL_DIFF
)
def get_near_duplicate_lead_source_hysteresis(self, prev_source, lead_one, lead_two, v_ego):
if prev_source not in ("lead0", "lead1"):
return 0.0, 0.0
if not self.leads_are_near_duplicates(lead_one, lead_two, v_ego):
return 0.0, 0.0
hysteresis = float(np.interp(
float(v_ego),
[NEAR_DUPLICATE_LEAD_SOURCE_MIN_SPEED, 35.0],
[NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MIN, NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MAX],
))
if prev_source == "lead0":
return 0.0, hysteresis
return hysteresis, 0.0
def set_accel_limits(self, min_a, max_a):
# TODO this sets a max accel limit, but the minimum limit is only for cruise decel
# needs refactor
@@ -590,12 +634,12 @@ class LongitudinalMpc:
self.max_a = max_a
def update(self, radarstate, v_cruise, x, v, a, j, danger_factor, t_follow,
personality=log.LongitudinalPersonality.standard, tracking_lead=True):
personality=log.LongitudinalPersonality.standard, tracking_lead=True,
optional_far_lead_comfort=True):
v_ego = self.x0[1]
lead_one = radarstate.leadOne
lead_two = radarstate.leadTwo
self.status = tracking_lead and (lead_one.status or lead_two.status)
lead_xv_0 = self.process_lead(lead_one, tracking_lead, t_follow=t_follow)
lead_xv_1 = self.process_lead(lead_two, tracking_lead, t_follow=t_follow)
@@ -622,14 +666,19 @@ class LongitudinalMpc:
v_upper)
cruise_obstacle = np.cumsum(T_DIFFS * v_cruise_clipped) + get_safe_obstacle_distance(v_cruise_clipped, t_follow)
prev_source = self.source
if prev_source == 'lead0':
cruise_obstacle += self.get_radarless_matched_follow_cruise_hysteresis(lead_one, v_ego, t_follow)
elif prev_source == 'lead1':
cruise_obstacle += self.get_radarless_matched_follow_cruise_hysteresis(lead_two, v_ego, t_follow)
if tracking_lead and lead_one.status:
if optional_far_lead_comfort:
if prev_source == 'lead0':
cruise_obstacle += self.get_radarless_matched_follow_cruise_hysteresis(lead_one, v_ego, t_follow)
elif prev_source == 'lead1':
cruise_obstacle += self.get_radarless_matched_follow_cruise_hysteresis(lead_two, v_ego, t_follow)
if optional_far_lead_comfort and tracking_lead and lead_one.status:
desired_gap = desired_follow_distance(v_ego, lead_one.vLead, t_follow)
closing_speed = max(0.0, v_ego - lead_one.vLead)
cruise_obstacle += get_tracked_lead_catchup_bias(v_ego, lead_one.dRel, desired_gap, closing_speed, v_cruise=v_cruise)
if optional_far_lead_comfort:
lead_0_bias, lead_1_bias = self.get_near_duplicate_lead_source_hysteresis(prev_source, lead_one, lead_two, v_ego)
lead_0_obstacle = lead_0_obstacle + lead_0_bias
lead_1_obstacle = lead_1_obstacle + lead_1_bias
x_obstacles = np.column_stack([lead_0_obstacle, lead_1_obstacle, cruise_obstacle])
self.source = SOURCES[np.argmin(x_obstacles[0])]
+212 -25
View File
@@ -12,6 +12,7 @@ from openpilot.starpilot.common.model_versions import is_tinygrad_model_version
from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import desired_follow_distance
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import should_trigger_planner_fcw
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import STOP_DISTANCE
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import T_IDXS as T_IDXS_MPC
from openpilot.selfdrive.controls.lib.lead_behavior import is_radarless_matched_follow_window
@@ -34,16 +35,16 @@ RAW_LEAD_SAFETY_TTC = 7.0
RAW_LEAD_SAFETY_DISTANCE = 40.0
STANDSTILL_LEAD_NUDGE_ACCEL = 0.05
STANDSTILL_LEAD_NUDGE_MIN_SPEED = 0.0
STANDSTILL_LEAD_DEPART_MIN_ACCEL = 0.20
STANDSTILL_LEAD_DEPART_MIN_ACCEL = 0.35
STANDSTILL_LEAD_DEPART_MAX_EGO_SPEED = 1.5
STANDSTILL_LEAD_DEPART_MIN_LEAD_SPEED = 0.6
STANDSTILL_LEAD_DEPART_MIN_GAP_MARGIN = 1.5
STANDSTILL_LEAD_DEPART_MIN_GAP_MARGIN = 0.8
STANDSTILL_LEAD_DEPART_MIN_MODEL_ACCEL = 0.08
LEAD_DEPART_CONFIDENT_MIN_GAP = 3.75
LEAD_DEPART_CONFIDENT_MAX_GAP = 5.25
LEAD_DEPART_CONFIDENT_MIN_LEAD_SPEED = 0.5
LEAD_DEPART_CONFIDENT_MIN_LEAD_DELTA = 0.45
LEAD_DEPART_CONFIDENT_MIN_LEAD_ACCEL = 0.35
LEAD_DEPART_CONFIDENT_MIN_LEAD_SPEED = 0.3
LEAD_DEPART_CONFIDENT_MIN_LEAD_DELTA = 0.25
LEAD_DEPART_CONFIDENT_MIN_LEAD_ACCEL = 0.2
LEAD_DEPART_ACCEL_HOLD_TIME = 1.2
LEAD_DEPART_ACCEL_HOLD_MAX_EGO_SPEED = 1.5
LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_SPEED = 0.6
@@ -224,6 +225,29 @@ FAR_LEAD_COMFORT_BRAKE_CAP_FULL_HEADWAY_MARGIN = 1.00
FAR_LEAD_COMFORT_BRAKE_CAP_MIN_DECEL = 0.05
FAR_LEAD_COMFORT_BRAKE_CAP_MAX_DECEL = 0.18
FAR_LEAD_COMFORT_BRAKE_CAP_FULL_RELAX_DECEL = 0.05
MATCHED_FOLLOW_TRANSITION_MIN_SPEED = 20.0
MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN = 0.25
MATCHED_FOLLOW_TRANSITION_FULL_HEADWAY_MARGIN = 0.75
MATCHED_FOLLOW_TRANSITION_MIN_MODEL_PROB = 0.9
MATCHED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE = 0.18
MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED = 1.75
MATCHED_FOLLOW_TRANSITION_MIN_TTC = 12.0
MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP = 0.08
MATCHED_FOLLOW_TRANSITION_MAX_POSITIVE_STEP = 0.18
MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP = 0.08
MATCHED_FOLLOW_TRANSITION_MAX_NEGATIVE_STEP = 0.16
MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP = 0.10
NEAR_DUPLICATE_LEAD_TRANSITION_MIN_SPEED = 20.0
NEAR_DUPLICATE_LEAD_TRANSITION_MIN_MODEL_PROB = 0.95
NEAR_DUPLICATE_LEAD_TRANSITION_MAX_LEAD_BRAKE = 0.35
NEAR_DUPLICATE_LEAD_TRANSITION_MAX_CLOSING_SPEED = 3.5
NEAR_DUPLICATE_LEAD_TRANSITION_MIN_TTC = 8.0
NEAR_DUPLICATE_LEAD_TRANSITION_MIN_HEADWAY_BELOW_TARGET = 0.45
NEAR_DUPLICATE_LEAD_TRANSITION_MAX_HEADWAY_ABOVE_TARGET = 0.85
NEAR_DUPLICATE_LEAD_TRANSITION_MIN_DELTA_A = 0.35
NEAR_DUPLICATE_LEAD_TRANSITION_POSITIVE_STEP = 0.22
NEAR_DUPLICATE_LEAD_TRANSITION_NEGATIVE_STEP = 0.32
NEAR_DUPLICATE_LEAD_TRANSITION_SIGN_CROSS_STEP = 0.18
TRACKED_VISION_MODEL_FLOOR_MIN_SPEED = 10.0
TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_PROB = 0.95
TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_DECEL = 0.80
@@ -295,6 +319,14 @@ def limit_accel_in_turns(v_ego, angle_steers, a_target, CP):
return [a_target[0], min(a_target[1], a_x_allowed)]
def should_publish_planner_fcw(crash_cnt: int, car_state, radar_state) -> bool:
return (
crash_cnt > 2 and
not car_state.standstill and
should_trigger_planner_fcw(radar_state.leadOne, float(car_state.vEgo))
)
def get_vehicle_min_accel(CP, v_ego):
# Planner-side physical decel capability estimate for GM pedal-long paths.
if getattr(CP, "carName", "") == "gm" and getattr(CP, "enableGasInterceptorDEPRECATED", False):
@@ -913,11 +945,8 @@ class LongitudinalPlanner:
return False
lead_radar = bool(getattr(lead, "radar", False))
if lead_radar:
return False
lead_prob = float(getattr(lead, "modelProb", 0.0))
if lead_prob < LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_PROB:
lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0))
if not lead_radar and lead_prob < LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_PROB:
return False
lead_speed = max(float(lead.vLead), 0.0)
@@ -1086,17 +1115,15 @@ class LongitudinalPlanner:
return self.lead_two
return None
def get_follow_control_lead(self, lead_control_active, v_ego, t_follow):
matched_follow_lead = self.get_matched_follow_control_lead(v_ego, t_follow)
if matched_follow_lead is not None:
return matched_follow_lead
def get_follow_control_lead(self, lead_control_active, v_ego, t_follow, *, allow_optional_far_lead_logic=True):
if allow_optional_far_lead_logic:
matched_follow_lead = self.get_matched_follow_control_lead(v_ego, t_follow)
if matched_follow_lead is not None:
return matched_follow_lead
if not lead_control_active:
return None
if self.mpc.source == 'lead1' and self.lead_is_matched_follow_window(self.lead_two, v_ego, t_follow):
return self.lead_two
if self.lead_one.status:
return self.lead_one
if self.lead_two.status:
@@ -1188,6 +1215,126 @@ class LongitudinalPlanner:
))
return -max(0.0, cap_decel - relax_decel)
def get_matched_follow_transition_target(self, lead, v_ego, base_t_follow, prev_output_a_target, output_a_target):
if lead is None or not lead.status:
return None
if float(v_ego) < MATCHED_FOLLOW_TRANSITION_MIN_SPEED:
return None
lead_prob = float(getattr(lead, "modelProb", 0.0))
if lead_prob < MATCHED_FOLLOW_TRANSITION_MIN_MODEL_PROB:
return None
lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0)))
if lead_brake > MATCHED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE:
return None
relative_speed = float(v_ego) - float(lead.vLead)
if not (STEADY_FOLLOW_BRAKE_CAP_MIN_REL_SPEED <= relative_speed <= STEADY_FOLLOW_SMOOTHING_MAX_CLOSING_SPEED):
return None
closing_speed = max(0.0, relative_speed)
if closing_speed > MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED:
return None
ttc = float(lead.dRel) / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf")
if ttc < MATCHED_FOLLOW_TRANSITION_MIN_TTC:
return None
actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3)
headway_margin = actual_headway - float(base_t_follow)
if headway_margin < MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN:
return None
if actual_headway > float(base_t_follow) + STEADY_FOLLOW_BRAKE_CAP_MAX_HEADWAY_ABOVE_TARGET:
return None
target_delta = float(output_a_target) - float(prev_output_a_target)
if abs(target_delta) < 1e-3:
return None
headway_factor = float(np.clip(
(headway_margin - MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN) /
max(MATCHED_FOLLOW_TRANSITION_FULL_HEADWAY_MARGIN - MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN, 1e-3),
0.0,
1.0,
))
positive_step = float(np.interp(
max(float(lead.vLead) - float(v_ego), 0.0),
[0.0, 1.0],
[MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP, MATCHED_FOLLOW_TRANSITION_MAX_POSITIVE_STEP],
))
negative_step = float(np.interp(
closing_speed,
[0.0, MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED],
[MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP, MATCHED_FOLLOW_TRANSITION_MAX_NEGATIVE_STEP],
))
# The more space we still have, the less abrupt the comfort path should be.
positive_step = float(np.interp(headway_factor, [0.0, 1.0], [positive_step, MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP]))
negative_step = float(np.interp(headway_factor, [0.0, 1.0], [negative_step, MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP]))
if float(prev_output_a_target) * float(output_a_target) < 0.0:
positive_step = min(positive_step, MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP)
negative_step = min(negative_step, MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP)
lower = float(prev_output_a_target) - negative_step
upper = float(prev_output_a_target) + positive_step
smoothed_target = float(np.clip(output_a_target, lower, upper))
return smoothed_target if abs(smoothed_target - float(output_a_target)) > 1e-6 else None
def get_near_duplicate_lead_transition_target(self, lead, v_ego, base_t_follow,
prev_output_a_target, output_a_target,
current_source, tracking_lead_active):
if lead is None or not lead.status:
return None
if current_source not in ("lead0", "lead1") and not tracking_lead_active:
return None
if not (self.lead_one.status and self.lead_two.status):
return None
if not self.mpc.leads_are_near_duplicates(self.lead_one, self.lead_two, v_ego):
return None
if float(v_ego) < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_SPEED:
return None
lead_prob = float(getattr(lead, "modelProb", 0.0))
if bool(getattr(lead, "radar", False)) or lead_prob < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_MODEL_PROB:
return None
lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0)))
if lead_brake > NEAR_DUPLICATE_LEAD_TRANSITION_MAX_LEAD_BRAKE:
return None
relative_speed = float(v_ego) - float(lead.vLead)
closing_speed = max(0.0, relative_speed)
if closing_speed > NEAR_DUPLICATE_LEAD_TRANSITION_MAX_CLOSING_SPEED:
return None
ttc = float(lead.dRel) / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf")
if ttc < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_TTC:
return None
actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3)
if actual_headway < max(0.0, float(base_t_follow) - NEAR_DUPLICATE_LEAD_TRANSITION_MIN_HEADWAY_BELOW_TARGET):
return None
if actual_headway > float(base_t_follow) + NEAR_DUPLICATE_LEAD_TRANSITION_MAX_HEADWAY_ABOVE_TARGET:
return None
target_delta = float(output_a_target) - float(prev_output_a_target)
if abs(target_delta) < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_DELTA_A:
return None
positive_step = NEAR_DUPLICATE_LEAD_TRANSITION_POSITIVE_STEP
negative_step = NEAR_DUPLICATE_LEAD_TRANSITION_NEGATIVE_STEP
if float(prev_output_a_target) * float(output_a_target) < 0.0:
positive_step = min(positive_step, NEAR_DUPLICATE_LEAD_TRANSITION_SIGN_CROSS_STEP)
negative_step = min(negative_step, NEAR_DUPLICATE_LEAD_TRANSITION_SIGN_CROSS_STEP)
lower = float(prev_output_a_target) - negative_step
upper = float(prev_output_a_target) + positive_step
smoothed_target = float(np.clip(output_a_target, lower, upper))
return smoothed_target if abs(smoothed_target - float(output_a_target)) > 1e-6 else None
def get_tracked_vision_model_brake_floor(self, lead, v_ego, accel_min, t_follow, model_desired):
if lead is None or not lead.status or bool(getattr(lead, "radar", False)):
return None
@@ -1560,9 +1707,11 @@ class LongitudinalPlanner:
dec_mpc_mode = self.get_mpc_mode()
if not self.mlsim:
self.mpc.mode = dec_mpc_mode
optional_far_lead_comfort = getattr(starpilot_toggles, "coast_up_to_leads", True)
self.mpc.update(sm['radarState'], v_cruise, x, v, a, j,
sm['starpilotPlan'].dangerFactor, effective_t_follow,
personality=personality, tracking_lead=lead_control_active)
personality=personality, tracking_lead=lead_control_active,
optional_far_lead_comfort=optional_far_lead_comfort)
self.a_desired_trajectory_full = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.a_solution)
self.v_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.v_solution)
@@ -1570,7 +1719,7 @@ class LongitudinalPlanner:
self.j_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC[:-1], self.mpc.j_solution)
# TODO counter is only needed because radar is glitchy, remove once radar is gone
self.fcw = self.mpc.crash_cnt > 2 and not sm['carState'].standstill
self.fcw = should_publish_planner_fcw(self.mpc.crash_cnt, sm['carState'], sm['radarState'])
if self.fcw:
cloudlog.info("FCW triggered")
@@ -1831,7 +1980,12 @@ class LongitudinalPlanner:
if vision_brake_cap_active:
output_accel_min = min(output_accel_min, vision_cap_accel_min)
follow_control_lead = self.get_follow_control_lead(lead_control_active, scene_v_ego, effective_t_follow)
follow_control_lead = self.get_follow_control_lead(
lead_control_active,
scene_v_ego,
effective_t_follow,
allow_optional_far_lead_logic=optional_far_lead_comfort,
)
if follow_control_lead is not None and not panic_bypass:
if not output_should_stop and not vision_low_speed_stop_active:
tracked_vision_model_brake_floor = self.get_tracked_vision_model_brake_floor(
@@ -1845,10 +1999,11 @@ class LongitudinalPlanner:
self.a_desired = min(self.a_desired, tracked_vision_model_brake_floor)
output_a_target = min(output_a_target, tracked_vision_model_brake_floor)
matched_follow_brake_cap = self.get_matched_follow_brake_cap(follow_control_lead, scene_v_ego, effective_t_follow)
if matched_follow_brake_cap is not None:
self.a_desired = max(self.a_desired, matched_follow_brake_cap)
output_a_target = max(output_a_target, matched_follow_brake_cap)
if optional_far_lead_comfort:
matched_follow_brake_cap = self.get_matched_follow_brake_cap(follow_control_lead, scene_v_ego, effective_t_follow)
if matched_follow_brake_cap is not None:
self.a_desired = max(self.a_desired, matched_follow_brake_cap)
output_a_target = max(output_a_target, matched_follow_brake_cap)
if not close_lead_caps and not output_should_stop and not vision_low_speed_stop_active:
low_speed_transition_brake_cap = self.get_low_speed_follow_transition_brake_cap(
@@ -1863,7 +2018,7 @@ class LongitudinalPlanner:
output_a_target = max(output_a_target, low_speed_transition_brake_cap)
comfort_lead = self.lead_two if self.mpc.source == 'lead1' and self.lead_two.status else self.lead_one
if comfort_lead is not None and not panic_bypass:
if optional_far_lead_comfort and comfort_lead is not None and not panic_bypass:
far_lead_brake_cap = self.get_far_lead_brake_cap(comfort_lead, scene_v_ego, effective_t_follow)
if far_lead_brake_cap is not None:
self.a_desired = max(self.a_desired, far_lead_brake_cap)
@@ -1880,6 +2035,38 @@ class LongitudinalPlanner:
self.a_desired = max(self.a_desired, tracked_vision_model_brake_cap)
output_a_target = max(output_a_target, tracked_vision_model_brake_cap)
if optional_far_lead_comfort and follow_control_lead is not None and not panic_bypass and not output_should_stop and not vision_low_speed_stop_active:
matched_follow_transition_target = self.get_matched_follow_transition_target(
follow_control_lead,
scene_v_ego,
effective_t_follow,
prev_output_a_target,
output_a_target,
)
if matched_follow_transition_target is not None:
if matched_follow_transition_target < output_a_target:
self.a_desired = min(self.a_desired, matched_follow_transition_target)
else:
self.a_desired = max(self.a_desired, matched_follow_transition_target)
output_a_target = matched_follow_transition_target
if optional_far_lead_comfort and comfort_lead is not None and not panic_bypass and not output_should_stop and not vision_low_speed_stop_active:
near_duplicate_transition_target = self.get_near_duplicate_lead_transition_target(
comfort_lead,
scene_v_ego,
effective_t_follow,
prev_output_a_target,
output_a_target,
self.mpc.source,
bool(getattr(sm["starpilotPlan"], "trackingLead", False)),
)
if near_duplicate_transition_target is not None:
if near_duplicate_transition_target < output_a_target:
self.a_desired = min(self.a_desired, near_duplicate_transition_target)
else:
self.a_desired = max(self.a_desired, near_duplicate_transition_target)
output_a_target = near_duplicate_transition_target
output_accel_max = no_throttle_output_max if not self.allow_throttle else accel_limits_turns[1]
output_a_target = float(np.clip(output_a_target, output_accel_min, output_accel_max))
+34 -8
View File
@@ -27,6 +27,8 @@ V_EGO_STATIONARY = 4. # no stationary object flag below this speed
RADAR_TO_CENTER = 2.7 # (deprecated) RADAR is ~ 2.7m ahead from center of car
RADAR_TO_CAMERA = 1.52 # RADAR is ~ 1.5m ahead from center of mesh frame
G90_RADAR_LOW_SPEED_MAX_DIST = 12.0
G90_RADAR_LOW_SPEED_MAX_Y = 0.6
class KalmanParams:
@@ -127,7 +129,21 @@ def laplacian_pdf(x: float, mu: float, b: float):
return math.exp(-abs(x-mu)/b)
def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, model_data: capnp._DynamicStructReader, tracks: dict[int, Track], starpilot_toggles: SimpleNamespace):
def g90_radar_lead_lateral_sane(track: Track) -> bool:
# The G90 extended radar channels can report close side ghosts in tight turns.
# Keep the gate tight at close range, then widen gradually with distance.
max_y = min(6.0, 1.5 + 0.08 * max(track.dRel, 0.0))
return abs(track.yRel) <= max_y
def g90_low_speed_radar_lead_sane(track: Track, v_ego: float) -> bool:
return (track.cnt >= 3 and v_ego < 3.0 and
0.75 < track.dRel < G90_RADAR_LOW_SPEED_MAX_DIST and
abs(track.yRel) < G90_RADAR_LOW_SPEED_MAX_Y)
def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, model_data: capnp._DynamicStructReader, tracks: dict[int, Track],
starpilot_toggles: SimpleNamespace, g90_radar_filter: bool = False):
if model_data.meta.laneChangeState == LaneChangeState.laneChangeStarting and getattr(starpilot_toggles, "human_lane_changes", False):
direction = model_data.meta.laneChangeDirection
if direction == LaneChangeDirection.left:
@@ -135,6 +151,9 @@ def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, model_
elif direction == LaneChangeDirection.right:
tracks = {k: v for k, v in tracks.items() if v.yRel < 0}
if g90_radar_filter:
tracks = {k: v for k, v in tracks.items() if g90_radar_lead_lateral_sane(v)}
if not tracks:
return None
@@ -180,12 +199,12 @@ def get_RadarState_from_vision(lead_msg: capnp._DynamicStructReader, v_ego: floa
def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capnp._DynamicStructReader,
model_v_ego: float, model_data: capnp._DynamicStructReader, standstill: bool,
starpilot_plan: capnp._DynamicStructReader, starpilot_toggles: SimpleNamespace,
low_speed_override: bool = True) -> dict[str, Any]:
low_speed_override: bool = True, g90_radar_filter: bool = False) -> dict[str, Any]:
lead_detection_probability = float(getattr(starpilot_toggles, "lead_detection_probability", 0.35))
# Determine leads, this is where the essential logic happens
if len(tracks) > 0 and ready and lead_msg.prob > lead_detection_probability:
track = match_vision_to_track(v_ego, lead_msg, model_data, tracks, starpilot_toggles)
track = match_vision_to_track(v_ego, lead_msg, model_data, tracks, starpilot_toggles, g90_radar_filter)
else:
track = None
@@ -196,7 +215,10 @@ def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capn
lead_dict = get_RadarState_from_vision(lead_msg, v_ego, model_v_ego)
if low_speed_override:
low_speed_tracks = [c for c in tracks.values() if c.potential_low_speed_lead(v_ego)]
if g90_radar_filter:
low_speed_tracks = [c for c in tracks.values() if g90_low_speed_radar_lead_sane(c, v_ego)]
else:
low_speed_tracks = [c for c in tracks.values() if c.potential_low_speed_lead(v_ego)]
if len(low_speed_tracks) > 0:
closest_track = min(low_speed_tracks, key=lambda c: c.dRel)
@@ -225,11 +247,12 @@ def get_adjacent_lead(tracks: dict[int, Track], standstill: bool, model_data: ca
class RadarD:
def __init__(self, radar_ts: float = DT_MDL, delay: float = 0.0):
def __init__(self, radar_ts: float = DT_MDL, delay: float = 0.0, g90_radar_filter: bool = False):
self.current_time = 0.0
self.tracks: dict[int, Track] = {}
self.kalman_params = KalmanParams(radar_ts)
self.g90_radar_filter = g90_radar_filter
self.v_ego = 0.0
self.v_ego_hist = deque([0.0], maxlen=int(round(delay / DT_MDL)) + 1)
@@ -286,9 +309,11 @@ class RadarD:
leads_v3 = sm['modelV2'].leadsV3
if len(leads_v3) > 1:
self.radar_state.leadOne = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[0], model_v_ego, sm['modelV2'],
sm['carState'].standstill, sm['starpilotPlan'], self.starpilot_toggles, low_speed_override=True)
sm['carState'].standstill, sm['starpilotPlan'], self.starpilot_toggles, low_speed_override=True,
g90_radar_filter=self.g90_radar_filter)
self.radar_state.leadTwo = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[1], model_v_ego, sm['modelV2'],
sm['carState'].standstill, sm['starpilotPlan'], self.starpilot_toggles, low_speed_override=False)
sm['carState'].standstill, sm['starpilotPlan'], self.starpilot_toggles, low_speed_override=False,
g90_radar_filter=self.g90_radar_filter)
if self.ready and (self.starpilot_toggles.adjacent_lead_tracking or self.starpilot_toggles.human_lane_changes):
self.starpilot_radar_state.leadLeft = get_adjacent_lead(self.tracks, sm['carState'].standstill, sm['modelV2'], left=True)
@@ -328,7 +353,8 @@ def main() -> None:
if not 0.01 < radar_ts < 0.2:
radar_ts = DT_MDL
RD = RadarD(radar_ts=radar_ts, delay=CP.radarDelay)
g90_radar_filter = CP.brand == "hyundai" and CP.carFingerprint == "GENESIS_G90"
RD = RadarD(radar_ts=radar_ts, delay=CP.radarDelay, g90_radar_filter=g90_radar_filter)
sm = sm.extend(['starpilotPlan'])
pm = pm.extend(['starpilotRadarState'])
+83 -6
View File
@@ -40,6 +40,9 @@ from openpilot.selfdrive.controls.lib.latcontrol_torque import (
get_genesis_g90_friction_scale,
get_genesis_g90_friction_threshold,
get_elantra_non_scc_ff_scale,
get_palisade_ff_scale,
get_palisade_friction_scale,
get_palisade_friction_threshold,
get_ioniq_5_ff_scale,
get_ioniq_5_friction_scale,
get_ioniq_5_friction_threshold,
@@ -58,6 +61,8 @@ from openpilot.selfdrive.controls.lib.latcontrol_torque import (
get_kia_ev6_ff_scale,
get_kia_ev6_friction_scale,
get_kia_ev6_friction_threshold,
get_sonata_center_taper_scale,
get_sonata_ff_scale,
get_sonata_hybrid_center_taper_scale,
get_sonata_hybrid_ff_scale,
get_volt_standard_center_taper_scale,
@@ -240,6 +245,26 @@ class TestLatControl:
assert get_sonata_hybrid_center_taper_scale(0.0, 3.0) < get_sonata_hybrid_center_taper_scale(0.0, 10.0)
assert get_sonata_hybrid_center_taper_scale(0.0, 30.0) < get_sonata_hybrid_center_taper_scale(0.20, 30.0) <= 1.0
def test_sonata_ff_scale_curve(self):
assert get_sonata_ff_scale(0.0, 0.0, 20.0) == 1.0
steady_left = get_sonata_ff_scale(0.45, 0.0, 8.0)
steady_right = get_sonata_ff_scale(-0.45, 0.0, 8.0)
turn_in_left = get_sonata_ff_scale(0.45, 0.8, 8.0)
turn_in_right = get_sonata_ff_scale(-0.45, -0.8, 8.0)
unwind_left = get_sonata_ff_scale(0.45, -0.8, 8.0)
unwind_right = get_sonata_ff_scale(-0.45, 0.8, 8.0)
assert steady_left < 1.0
assert steady_right < steady_left
assert turn_in_left > steady_left
assert turn_in_right == pytest.approx(steady_right)
assert unwind_left < steady_left
assert unwind_right == pytest.approx(steady_right)
def test_sonata_center_taper_curve(self):
assert get_sonata_center_taper_scale(0.0, 30.0) < get_sonata_center_taper_scale(0.0, 15.0)
assert get_sonata_center_taper_scale(0.0, 3.0) < get_sonata_center_taper_scale(0.0, 10.0)
assert get_sonata_center_taper_scale(0.0, 30.0) < get_sonata_center_taper_scale(0.20, 30.0) <= 1.0
def test_elantra_non_scc_ff_scale_curve(self):
assert get_elantra_non_scc_ff_scale(0.0, 0.0, 20.0) == 1.0
steady_left = get_elantra_non_scc_ff_scale(0.45, 0.0, 8.0)
@@ -305,6 +330,39 @@ class TestLatControl:
assert left_turn_in > right_turn_in > base
assert base > left_unwind > right_unwind
def test_palisade_ff_scale_curve(self):
assert get_palisade_ff_scale(0.0, 0.0, 20.0) == 1.0
steady_left = get_palisade_ff_scale(0.6, 0.0, 8.0)
steady_right = get_palisade_ff_scale(-0.6, 0.0, 8.0)
turn_in_left = get_palisade_ff_scale(0.6, 0.8, 8.0)
turn_in_right = get_palisade_ff_scale(-0.6, -0.8, 8.0)
unwind_left = get_palisade_ff_scale(0.6, -0.8, 8.0)
unwind_right = get_palisade_ff_scale(-0.6, 0.8, 8.0)
assert steady_left > 1.0
assert steady_right > 1.0
assert turn_in_left > steady_left
assert turn_in_right > steady_right
assert unwind_left < steady_left
assert unwind_right < steady_right
assert unwind_right < unwind_left
def test_palisade_friction_threshold_curve(self):
base = get_friction_threshold(6.0)
left_turn_in = get_palisade_friction_threshold(6.0, 0.7, 0.8)
right_turn_in = get_palisade_friction_threshold(6.0, -0.7, -0.8)
left_unwind = get_palisade_friction_threshold(6.0, 0.7, -0.8)
right_unwind = get_palisade_friction_threshold(6.0, -0.7, 0.8)
assert left_turn_in < right_turn_in < base < left_unwind < right_unwind
def test_palisade_friction_scale_curve(self):
base = get_palisade_friction_scale(25.0, 0.7, 0.8)
left_turn_in = get_palisade_friction_scale(6.0, 0.7, 0.8)
right_turn_in = get_palisade_friction_scale(6.0, -0.7, -0.8)
left_unwind = get_palisade_friction_scale(6.0, 0.7, -0.8)
right_unwind = get_palisade_friction_scale(6.0, -0.7, 0.8)
assert left_turn_in > right_turn_in > base
assert base > left_unwind > right_unwind
def test_ioniq_5_ff_scale_curve(self):
assert get_ioniq_5_ff_scale(0.0, 0.0, 20.0) == 1.0
steady_left = get_ioniq_5_ff_scale(0.7, 0.0, 12.0)
@@ -316,7 +374,7 @@ class TestLatControl:
assert steady_left < 1.0
assert steady_right < steady_left
assert turn_in_left > steady_left
assert turn_in_right >= steady_right
assert turn_in_right > steady_right
assert unwind_left < steady_left
assert unwind_right < unwind_left
@@ -327,7 +385,7 @@ class TestLatControl:
unwind_left_threshold = get_ioniq_5_friction_threshold(12.0, 0.7, -0.8)
unwind_right_threshold = get_ioniq_5_friction_threshold(12.0, -0.7, 0.8)
assert turn_in_left_threshold < base
assert turn_in_right_threshold == pytest.approx(base)
assert turn_in_left_threshold < turn_in_right_threshold < base
assert unwind_left_threshold > base
assert unwind_right_threshold > unwind_left_threshold
@@ -335,10 +393,9 @@ class TestLatControl:
turn_in_right_scale = get_ioniq_5_friction_scale(12.0, -0.7, -0.8)
unwind_left_scale = get_ioniq_5_friction_scale(12.0, 0.7, -0.8)
unwind_right_scale = get_ioniq_5_friction_scale(12.0, -0.7, 0.8)
assert turn_in_left_scale > 1.0
assert turn_in_right_scale == pytest.approx(1.0)
assert turn_in_left_scale > turn_in_right_scale > 1.0
assert unwind_left_scale < 1.0
assert unwind_right_scale < unwind_left_scale
assert unwind_right_scale <= unwind_left_scale
def test_ioniq_5_center_taper_curve(self):
assert get_ioniq_5_center_taper_scale(0.0, 25.0) < get_ioniq_5_center_taper_scale(0.0, 10.0)
@@ -426,7 +483,7 @@ class TestLatControl:
right_turn_in = get_kia_ev6_friction_threshold(6.0, -0.5, -0.8)
left_unwind = get_kia_ev6_friction_threshold(6.0, 0.5, -0.8)
right_unwind = get_kia_ev6_friction_threshold(6.0, -0.5, 0.8)
assert right_turn_in < left_turn_in < base < right_unwind < left_unwind
assert right_turn_in < left_turn_in < base < right_unwind <= left_unwind
def test_kia_ev6_friction_scale_curve(self):
base = get_kia_ev6_friction_scale(25.0, 0.5, 0.8)
@@ -491,6 +548,26 @@ class TestLatControl:
assert lac_log.active
def test_palisade_default_update_path(self):
controller, VM, CS, params, starpilot_toggles = self._build_torque_controller(HYUNDAI.HYUNDAI_PALISADE_2023)
CarInterface = interfaces[HYUNDAI.HYUNDAI_PALISADE_2023]
CP = CarInterface.get_non_essential_params(HYUNDAI.HYUNDAI_PALISADE_2023)
_, _, lac_log = controller.update(True, CS, VM, params, False, 0.0025, False, 0.2, None, None, starpilot_toggles)
assert lac_log.active
assert controller.torque_params.latAccelFactor == pytest.approx(CP.lateralTuning.torque.latAccelFactor * 0.98)
def test_sonata_default_update_path(self):
controller, VM, CS, params, starpilot_toggles = self._build_torque_controller(HYUNDAI.HYUNDAI_SONATA)
CarInterface = interfaces[HYUNDAI.HYUNDAI_SONATA]
CP = CarInterface.get_non_essential_params(HYUNDAI.HYUNDAI_SONATA)
_, _, lac_log = controller.update(True, CS, VM, params, False, 0.0025, False, 0.2, None, None, starpilot_toggles)
assert lac_log.active
assert controller.torque_params.latAccelFactor == pytest.approx(CP.lateralTuning.torque.latAccelFactor)
def test_ioniq_5_default_update_path(self):
controller, VM, CS, params, starpilot_toggles = self._build_torque_controller(HYUNDAI.HYUNDAI_IONIQ_5)
CarInterface = interfaces[HYUNDAI.HYUNDAI_IONIQ_5]
+17
View File
@@ -1,10 +1,27 @@
from types import SimpleNamespace
import cereal.messaging as messaging
from opendbc.car.toyota.values import CAR as TOYOTA
from openpilot.selfdrive.test.process_replay import replay_process_with_name
from openpilot.selfdrive.controls.radard import g90_low_speed_radar_lead_sane, g90_radar_lead_lateral_sane
class TestLeads:
def test_g90_radar_filters_side_tracks(self):
side_track = SimpleNamespace(dRel=13.0, yRel=-10.38, cnt=10)
centered_track = SimpleNamespace(dRel=10.8, yRel=-0.21, cnt=5)
close_side_ghost = SimpleNamespace(dRel=2.2, yRel=2.41, cnt=10)
close_centered_track = SimpleNamespace(dRel=2.2, yRel=1.2, cnt=10)
far_low_speed_track = SimpleNamespace(dRel=15.5, yRel=0.58, cnt=5)
assert not g90_radar_lead_lateral_sane(side_track)
assert g90_radar_lead_lateral_sane(centered_track)
assert not g90_radar_lead_lateral_sane(close_side_ghost)
assert g90_radar_lead_lateral_sane(close_centered_track)
assert g90_low_speed_radar_lead_sane(centered_track, 2.0)
assert not g90_low_speed_radar_lead_sane(far_low_speed_track, 3.5)
def test_radar_fault(self):
# if there's no radar-related can traffic, radard should either not respond or respond with an error
# this is tightly coupled with underlying car radar_interface implementation, but it's a good sanity check
@@ -11,7 +11,7 @@ from opendbc.car.honda.values import CAR
import openpilot.selfdrive.controls.lib.longitudinal_planner as longitudinal_planner_module
from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState
from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N
from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner, get_coast_accel, get_vehicle_min_accel
from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner, get_coast_accel, get_vehicle_min_accel, should_publish_planner_fcw
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import soften_far_radar_lead_accel, should_trigger_planner_fcw
from openpilot.selfdrive.modeld.constants import ModelConstants, Plan
@@ -225,6 +225,22 @@ def test_planner_fcw_keeps_real_low_speed_closing_alerts():
)
def test_publish_planner_fcw_suppresses_crawl_speed_false_positive():
car_state = SimpleNamespace(vEgo=0.29, standstill=False)
radar_state = SimpleNamespace(
leadOne=make_lead(status=True, d_rel=7.55, v_lead=0.033, a_lead=0.0, radar=False, model_prob=0.99),
)
assert not should_publish_planner_fcw(3, car_state, radar_state)
def test_publish_planner_fcw_keeps_real_current_close_closing_alert():
car_state = SimpleNamespace(vEgo=1.6, standstill=False)
radar_state = SimpleNamespace(
leadOne=make_lead(status=True, d_rel=1.8, v_lead=0.0, a_lead=0.0, radar=False, model_prob=0.99),
)
assert should_publish_planner_fcw(3, car_state, radar_state)
def test_vision_lead_approach_cap_brakes_before_hard_cap():
v_ego = 21.535
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
@@ -1702,6 +1718,19 @@ def test_follow_control_lead_prefers_active_lead1_for_matched_follow():
assert follow_lead is planner.lead_two
def test_follow_control_lead_disables_optional_matched_follow_override():
v_ego = 23.3
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
planner.lead_one = make_lead(status=True, d_rel=80.0, v_lead=20.0, radar=False, model_prob=0.6)
planner.lead_two = make_lead(status=True, d_rel=49.9, v_lead=21.9, radar=False, model_prob=0.98)
planner.mpc.source = "lead1"
follow_lead = planner.get_follow_control_lead(True, v_ego, 1.45, allow_optional_far_lead_logic=False)
assert follow_lead is planner.lead_one
def test_follow_control_lead_keeps_matched_follow_lead_without_tracking_latch():
v_ego = 27.5
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
@@ -1713,6 +1742,17 @@ def test_follow_control_lead_keeps_matched_follow_lead_without_tracking_latch():
assert follow_lead is planner.lead_one
def test_follow_control_lead_requires_real_lead_control_when_optional_logic_disabled():
v_ego = 27.5
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
planner.lead_one = make_lead(status=True, d_rel=61.99, v_lead=27.63, radar=False, model_prob=0.99)
follow_lead = planner.get_follow_control_lead(False, v_ego, 1.45, allow_optional_far_lead_logic=False)
assert follow_lead is None
def test_far_lead_soft_brake_cap_limits_high_confidence_distant_vision_lead():
v_ego = 32.37
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
@@ -1724,3 +1764,139 @@ def test_far_lead_soft_brake_cap_limits_high_confidence_distant_vision_lead():
assert cap is not None
assert cap > -0.2
assert cap < -0.05
def test_matched_follow_transition_target_damps_large_comfort_sign_flip():
v_ego = 20.3
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead = make_lead(status=True, d_rel=45.6, v_lead=19.19, a_lead=0.0, radar=False, model_prob=0.99)
smoothed = planner.get_matched_follow_transition_target(
lead,
v_ego,
1.45,
prev_output_a_target=0.12,
output_a_target=-0.40,
)
assert smoothed is not None
assert smoothed > -0.05
assert smoothed < 0.12
def test_matched_follow_transition_target_skips_urgent_closure():
v_ego = 31.5
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead = make_lead(status=True, d_rel=35.0, v_lead=28.0, a_lead=0.0, radar=False, model_prob=0.99)
smoothed = planner.get_matched_follow_transition_target(
lead,
v_ego,
1.45,
prev_output_a_target=0.10,
output_a_target=-0.60,
)
assert smoothed is None
def test_near_duplicate_lead_source_hysteresis_prefers_previous_source():
v_ego = 27.0
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead_one = make_lead(status=True, d_rel=46.2, v_lead=25.5, a_lead=-0.05, radar=False, model_prob=0.99)
lead_two = make_lead(status=True, d_rel=46.8, v_lead=25.55, a_lead=-0.03, radar=False, model_prob=0.99)
lead_0_bias, lead_1_bias = planner.mpc.get_near_duplicate_lead_source_hysteresis("lead0", lead_one, lead_two, v_ego)
assert lead_0_bias == 0.0
assert lead_1_bias > 0.0
def test_near_duplicate_lead_source_hysteresis_skips_distinct_leads():
v_ego = 27.0
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead_one = make_lead(status=True, d_rel=41.0, v_lead=23.8, a_lead=0.0, radar=False, model_prob=0.99)
lead_two = make_lead(status=True, d_rel=48.0, v_lead=25.4, a_lead=0.0, radar=False, model_prob=0.99)
lead_0_bias, lead_1_bias = planner.mpc.get_near_duplicate_lead_source_hysteresis("lead0", lead_one, lead_two, v_ego)
assert lead_0_bias == 0.0
assert lead_1_bias == 0.0
def test_near_duplicate_lead_transition_target_damps_same_source_sign_flip():
v_ego = 25.0
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead_one = make_lead(status=True, d_rel=44.6, v_lead=24.05, a_lead=-0.03, radar=False, model_prob=0.99)
lead_two = make_lead(status=True, d_rel=45.1, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99)
lead_one.vRel = -0.95
lead_two.vRel = -1.00
planner.lead_one = lead_one
planner.lead_two = lead_two
smoothed = planner.get_near_duplicate_lead_transition_target(
lead_two,
v_ego,
1.45,
prev_output_a_target=-1.10,
output_a_target=0.13,
current_source="lead1",
tracking_lead_active=True,
)
assert smoothed is not None
assert smoothed == pytest.approx(-0.92, abs=1e-6)
def test_near_duplicate_lead_transition_target_damps_tracking_cruise_sign_flip():
v_ego = 25.0
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead_one = make_lead(status=True, d_rel=44.6, v_lead=24.05, a_lead=-0.03, radar=False, model_prob=0.99)
lead_two = make_lead(status=True, d_rel=45.1, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99)
lead_one.vRel = -0.95
lead_two.vRel = -1.00
planner.lead_one = lead_one
planner.lead_two = lead_two
smoothed = planner.get_near_duplicate_lead_transition_target(
lead_two,
v_ego,
1.45,
prev_output_a_target=-1.10,
output_a_target=0.13,
current_source="cruise",
tracking_lead_active=True,
)
assert smoothed is not None
assert smoothed == pytest.approx(-0.92, abs=1e-6)
def test_near_duplicate_lead_transition_target_skips_plain_cruise_without_tracking():
v_ego = 25.0
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=v_ego)
lead_one = make_lead(status=True, d_rel=44.6, v_lead=24.05, a_lead=-0.03, radar=False, model_prob=0.99)
lead_two = make_lead(status=True, d_rel=45.1, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99)
lead_one.vRel = -0.95
lead_two.vRel = -1.00
planner.lead_one = lead_one
planner.lead_two = lead_two
smoothed = planner.get_near_duplicate_lead_transition_target(
lead_two,
v_ego,
1.45,
prev_output_a_target=-1.10,
output_a_target=0.13,
current_source="cruise",
tracking_lead_active=False,
)
assert smoothed is None
@@ -93,6 +93,52 @@ def test_nav_desires_turn_right_waits_until_turn_is_close():
assert helper.desire == log.Desire.none
def test_nav_desires_off_ramp_lane_guidance_becomes_keep_right():
helper = DesireHelper()
helper.nav_desires_allowed = True
helper._update_nav_params = lambda: None
helper._nav_instruction_state = {
"valid": True,
"maneuverType": "off ramp",
"maneuverModifier": "right",
"activeLaneDirection": "slightRight",
"maneuverDistance": 120.0,
}
helper.update(
make_car_state(vEgo=22.5),
True,
0.0,
make_plan(laneWidthRight=4.2),
make_toggles(nudgeless=True),
)
assert helper.desire == log.Desire.keepRight
def test_nav_desires_off_ramp_lane_guidance_waits_until_split_is_close():
helper = DesireHelper()
helper.nav_desires_allowed = True
helper._update_nav_params = lambda: None
helper._nav_instruction_state = {
"valid": True,
"maneuverType": "off ramp",
"maneuverModifier": "right",
"activeLaneDirection": "slightRight",
"maneuverDistance": 300.0,
}
helper.update(
make_car_state(vEgo=22.5),
True,
0.0,
make_plan(laneWidthRight=4.2),
make_toggles(nudgeless=True),
)
assert helper.desire == log.Desire.none
def test_nav_desires_do_not_override_lane_change_state_machine():
helper = DesireHelper()
helper.nav_desires_allowed = True
+342 -342
View File
@@ -45,326 +45,326 @@ const static double MAHA_THRESH_31 = 3.8414588206941227;
* *
* This file is part of 'ekf' *
******************************************************************************/
void err_fun(double *nom_x, double *delta_x, double *out_4387195160971747702) {
out_4387195160971747702[0] = delta_x[0] + nom_x[0];
out_4387195160971747702[1] = delta_x[1] + nom_x[1];
out_4387195160971747702[2] = delta_x[2] + nom_x[2];
out_4387195160971747702[3] = delta_x[3] + nom_x[3];
out_4387195160971747702[4] = delta_x[4] + nom_x[4];
out_4387195160971747702[5] = delta_x[5] + nom_x[5];
out_4387195160971747702[6] = delta_x[6] + nom_x[6];
out_4387195160971747702[7] = delta_x[7] + nom_x[7];
out_4387195160971747702[8] = delta_x[8] + nom_x[8];
void err_fun(double *nom_x, double *delta_x, double *out_6018065189512211380) {
out_6018065189512211380[0] = delta_x[0] + nom_x[0];
out_6018065189512211380[1] = delta_x[1] + nom_x[1];
out_6018065189512211380[2] = delta_x[2] + nom_x[2];
out_6018065189512211380[3] = delta_x[3] + nom_x[3];
out_6018065189512211380[4] = delta_x[4] + nom_x[4];
out_6018065189512211380[5] = delta_x[5] + nom_x[5];
out_6018065189512211380[6] = delta_x[6] + nom_x[6];
out_6018065189512211380[7] = delta_x[7] + nom_x[7];
out_6018065189512211380[8] = delta_x[8] + nom_x[8];
}
void inv_err_fun(double *nom_x, double *true_x, double *out_7707264064834051115) {
out_7707264064834051115[0] = -nom_x[0] + true_x[0];
out_7707264064834051115[1] = -nom_x[1] + true_x[1];
out_7707264064834051115[2] = -nom_x[2] + true_x[2];
out_7707264064834051115[3] = -nom_x[3] + true_x[3];
out_7707264064834051115[4] = -nom_x[4] + true_x[4];
out_7707264064834051115[5] = -nom_x[5] + true_x[5];
out_7707264064834051115[6] = -nom_x[6] + true_x[6];
out_7707264064834051115[7] = -nom_x[7] + true_x[7];
out_7707264064834051115[8] = -nom_x[8] + true_x[8];
void inv_err_fun(double *nom_x, double *true_x, double *out_1095263434101283480) {
out_1095263434101283480[0] = -nom_x[0] + true_x[0];
out_1095263434101283480[1] = -nom_x[1] + true_x[1];
out_1095263434101283480[2] = -nom_x[2] + true_x[2];
out_1095263434101283480[3] = -nom_x[3] + true_x[3];
out_1095263434101283480[4] = -nom_x[4] + true_x[4];
out_1095263434101283480[5] = -nom_x[5] + true_x[5];
out_1095263434101283480[6] = -nom_x[6] + true_x[6];
out_1095263434101283480[7] = -nom_x[7] + true_x[7];
out_1095263434101283480[8] = -nom_x[8] + true_x[8];
}
void H_mod_fun(double *state, double *out_7178605602671138983) {
out_7178605602671138983[0] = 1.0;
out_7178605602671138983[1] = 0.0;
out_7178605602671138983[2] = 0.0;
out_7178605602671138983[3] = 0.0;
out_7178605602671138983[4] = 0.0;
out_7178605602671138983[5] = 0.0;
out_7178605602671138983[6] = 0.0;
out_7178605602671138983[7] = 0.0;
out_7178605602671138983[8] = 0.0;
out_7178605602671138983[9] = 0.0;
out_7178605602671138983[10] = 1.0;
out_7178605602671138983[11] = 0.0;
out_7178605602671138983[12] = 0.0;
out_7178605602671138983[13] = 0.0;
out_7178605602671138983[14] = 0.0;
out_7178605602671138983[15] = 0.0;
out_7178605602671138983[16] = 0.0;
out_7178605602671138983[17] = 0.0;
out_7178605602671138983[18] = 0.0;
out_7178605602671138983[19] = 0.0;
out_7178605602671138983[20] = 1.0;
out_7178605602671138983[21] = 0.0;
out_7178605602671138983[22] = 0.0;
out_7178605602671138983[23] = 0.0;
out_7178605602671138983[24] = 0.0;
out_7178605602671138983[25] = 0.0;
out_7178605602671138983[26] = 0.0;
out_7178605602671138983[27] = 0.0;
out_7178605602671138983[28] = 0.0;
out_7178605602671138983[29] = 0.0;
out_7178605602671138983[30] = 1.0;
out_7178605602671138983[31] = 0.0;
out_7178605602671138983[32] = 0.0;
out_7178605602671138983[33] = 0.0;
out_7178605602671138983[34] = 0.0;
out_7178605602671138983[35] = 0.0;
out_7178605602671138983[36] = 0.0;
out_7178605602671138983[37] = 0.0;
out_7178605602671138983[38] = 0.0;
out_7178605602671138983[39] = 0.0;
out_7178605602671138983[40] = 1.0;
out_7178605602671138983[41] = 0.0;
out_7178605602671138983[42] = 0.0;
out_7178605602671138983[43] = 0.0;
out_7178605602671138983[44] = 0.0;
out_7178605602671138983[45] = 0.0;
out_7178605602671138983[46] = 0.0;
out_7178605602671138983[47] = 0.0;
out_7178605602671138983[48] = 0.0;
out_7178605602671138983[49] = 0.0;
out_7178605602671138983[50] = 1.0;
out_7178605602671138983[51] = 0.0;
out_7178605602671138983[52] = 0.0;
out_7178605602671138983[53] = 0.0;
out_7178605602671138983[54] = 0.0;
out_7178605602671138983[55] = 0.0;
out_7178605602671138983[56] = 0.0;
out_7178605602671138983[57] = 0.0;
out_7178605602671138983[58] = 0.0;
out_7178605602671138983[59] = 0.0;
out_7178605602671138983[60] = 1.0;
out_7178605602671138983[61] = 0.0;
out_7178605602671138983[62] = 0.0;
out_7178605602671138983[63] = 0.0;
out_7178605602671138983[64] = 0.0;
out_7178605602671138983[65] = 0.0;
out_7178605602671138983[66] = 0.0;
out_7178605602671138983[67] = 0.0;
out_7178605602671138983[68] = 0.0;
out_7178605602671138983[69] = 0.0;
out_7178605602671138983[70] = 1.0;
out_7178605602671138983[71] = 0.0;
out_7178605602671138983[72] = 0.0;
out_7178605602671138983[73] = 0.0;
out_7178605602671138983[74] = 0.0;
out_7178605602671138983[75] = 0.0;
out_7178605602671138983[76] = 0.0;
out_7178605602671138983[77] = 0.0;
out_7178605602671138983[78] = 0.0;
out_7178605602671138983[79] = 0.0;
out_7178605602671138983[80] = 1.0;
void H_mod_fun(double *state, double *out_2728844015902940614) {
out_2728844015902940614[0] = 1.0;
out_2728844015902940614[1] = 0.0;
out_2728844015902940614[2] = 0.0;
out_2728844015902940614[3] = 0.0;
out_2728844015902940614[4] = 0.0;
out_2728844015902940614[5] = 0.0;
out_2728844015902940614[6] = 0.0;
out_2728844015902940614[7] = 0.0;
out_2728844015902940614[8] = 0.0;
out_2728844015902940614[9] = 0.0;
out_2728844015902940614[10] = 1.0;
out_2728844015902940614[11] = 0.0;
out_2728844015902940614[12] = 0.0;
out_2728844015902940614[13] = 0.0;
out_2728844015902940614[14] = 0.0;
out_2728844015902940614[15] = 0.0;
out_2728844015902940614[16] = 0.0;
out_2728844015902940614[17] = 0.0;
out_2728844015902940614[18] = 0.0;
out_2728844015902940614[19] = 0.0;
out_2728844015902940614[20] = 1.0;
out_2728844015902940614[21] = 0.0;
out_2728844015902940614[22] = 0.0;
out_2728844015902940614[23] = 0.0;
out_2728844015902940614[24] = 0.0;
out_2728844015902940614[25] = 0.0;
out_2728844015902940614[26] = 0.0;
out_2728844015902940614[27] = 0.0;
out_2728844015902940614[28] = 0.0;
out_2728844015902940614[29] = 0.0;
out_2728844015902940614[30] = 1.0;
out_2728844015902940614[31] = 0.0;
out_2728844015902940614[32] = 0.0;
out_2728844015902940614[33] = 0.0;
out_2728844015902940614[34] = 0.0;
out_2728844015902940614[35] = 0.0;
out_2728844015902940614[36] = 0.0;
out_2728844015902940614[37] = 0.0;
out_2728844015902940614[38] = 0.0;
out_2728844015902940614[39] = 0.0;
out_2728844015902940614[40] = 1.0;
out_2728844015902940614[41] = 0.0;
out_2728844015902940614[42] = 0.0;
out_2728844015902940614[43] = 0.0;
out_2728844015902940614[44] = 0.0;
out_2728844015902940614[45] = 0.0;
out_2728844015902940614[46] = 0.0;
out_2728844015902940614[47] = 0.0;
out_2728844015902940614[48] = 0.0;
out_2728844015902940614[49] = 0.0;
out_2728844015902940614[50] = 1.0;
out_2728844015902940614[51] = 0.0;
out_2728844015902940614[52] = 0.0;
out_2728844015902940614[53] = 0.0;
out_2728844015902940614[54] = 0.0;
out_2728844015902940614[55] = 0.0;
out_2728844015902940614[56] = 0.0;
out_2728844015902940614[57] = 0.0;
out_2728844015902940614[58] = 0.0;
out_2728844015902940614[59] = 0.0;
out_2728844015902940614[60] = 1.0;
out_2728844015902940614[61] = 0.0;
out_2728844015902940614[62] = 0.0;
out_2728844015902940614[63] = 0.0;
out_2728844015902940614[64] = 0.0;
out_2728844015902940614[65] = 0.0;
out_2728844015902940614[66] = 0.0;
out_2728844015902940614[67] = 0.0;
out_2728844015902940614[68] = 0.0;
out_2728844015902940614[69] = 0.0;
out_2728844015902940614[70] = 1.0;
out_2728844015902940614[71] = 0.0;
out_2728844015902940614[72] = 0.0;
out_2728844015902940614[73] = 0.0;
out_2728844015902940614[74] = 0.0;
out_2728844015902940614[75] = 0.0;
out_2728844015902940614[76] = 0.0;
out_2728844015902940614[77] = 0.0;
out_2728844015902940614[78] = 0.0;
out_2728844015902940614[79] = 0.0;
out_2728844015902940614[80] = 1.0;
}
void f_fun(double *state, double dt, double *out_2416599425795193412) {
out_2416599425795193412[0] = state[0];
out_2416599425795193412[1] = state[1];
out_2416599425795193412[2] = state[2];
out_2416599425795193412[3] = state[3];
out_2416599425795193412[4] = state[4];
out_2416599425795193412[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8100000000000005*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5];
out_2416599425795193412[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6];
out_2416599425795193412[7] = state[7];
out_2416599425795193412[8] = state[8];
void f_fun(double *state, double dt, double *out_6525929466162239676) {
out_6525929466162239676[0] = state[0];
out_6525929466162239676[1] = state[1];
out_6525929466162239676[2] = state[2];
out_6525929466162239676[3] = state[3];
out_6525929466162239676[4] = state[4];
out_6525929466162239676[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8100000000000005*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5];
out_6525929466162239676[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6];
out_6525929466162239676[7] = state[7];
out_6525929466162239676[8] = state[8];
}
void F_fun(double *state, double dt, double *out_6761986232654706930) {
out_6761986232654706930[0] = 1;
out_6761986232654706930[1] = 0;
out_6761986232654706930[2] = 0;
out_6761986232654706930[3] = 0;
out_6761986232654706930[4] = 0;
out_6761986232654706930[5] = 0;
out_6761986232654706930[6] = 0;
out_6761986232654706930[7] = 0;
out_6761986232654706930[8] = 0;
out_6761986232654706930[9] = 0;
out_6761986232654706930[10] = 1;
out_6761986232654706930[11] = 0;
out_6761986232654706930[12] = 0;
out_6761986232654706930[13] = 0;
out_6761986232654706930[14] = 0;
out_6761986232654706930[15] = 0;
out_6761986232654706930[16] = 0;
out_6761986232654706930[17] = 0;
out_6761986232654706930[18] = 0;
out_6761986232654706930[19] = 0;
out_6761986232654706930[20] = 1;
out_6761986232654706930[21] = 0;
out_6761986232654706930[22] = 0;
out_6761986232654706930[23] = 0;
out_6761986232654706930[24] = 0;
out_6761986232654706930[25] = 0;
out_6761986232654706930[26] = 0;
out_6761986232654706930[27] = 0;
out_6761986232654706930[28] = 0;
out_6761986232654706930[29] = 0;
out_6761986232654706930[30] = 1;
out_6761986232654706930[31] = 0;
out_6761986232654706930[32] = 0;
out_6761986232654706930[33] = 0;
out_6761986232654706930[34] = 0;
out_6761986232654706930[35] = 0;
out_6761986232654706930[36] = 0;
out_6761986232654706930[37] = 0;
out_6761986232654706930[38] = 0;
out_6761986232654706930[39] = 0;
out_6761986232654706930[40] = 1;
out_6761986232654706930[41] = 0;
out_6761986232654706930[42] = 0;
out_6761986232654706930[43] = 0;
out_6761986232654706930[44] = 0;
out_6761986232654706930[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4]));
out_6761986232654706930[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2));
out_6761986232654706930[47] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_6761986232654706930[48] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_6761986232654706930[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2)));
out_6761986232654706930[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1;
out_6761986232654706930[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]));
out_6761986232654706930[52] = dt*stiffness_front*state[0]/(mass*state[1]);
out_6761986232654706930[53] = -9.8100000000000005*dt;
out_6761986232654706930[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4]));
out_6761986232654706930[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2));
out_6761986232654706930[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_6761986232654706930[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_6761986232654706930[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2)));
out_6761986232654706930[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]);
out_6761986232654706930[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1;
out_6761986232654706930[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_6761986232654706930[62] = 0;
out_6761986232654706930[63] = 0;
out_6761986232654706930[64] = 0;
out_6761986232654706930[65] = 0;
out_6761986232654706930[66] = 0;
out_6761986232654706930[67] = 0;
out_6761986232654706930[68] = 0;
out_6761986232654706930[69] = 0;
out_6761986232654706930[70] = 1;
out_6761986232654706930[71] = 0;
out_6761986232654706930[72] = 0;
out_6761986232654706930[73] = 0;
out_6761986232654706930[74] = 0;
out_6761986232654706930[75] = 0;
out_6761986232654706930[76] = 0;
out_6761986232654706930[77] = 0;
out_6761986232654706930[78] = 0;
out_6761986232654706930[79] = 0;
out_6761986232654706930[80] = 1;
void F_fun(double *state, double dt, double *out_2819353980597124361) {
out_2819353980597124361[0] = 1;
out_2819353980597124361[1] = 0;
out_2819353980597124361[2] = 0;
out_2819353980597124361[3] = 0;
out_2819353980597124361[4] = 0;
out_2819353980597124361[5] = 0;
out_2819353980597124361[6] = 0;
out_2819353980597124361[7] = 0;
out_2819353980597124361[8] = 0;
out_2819353980597124361[9] = 0;
out_2819353980597124361[10] = 1;
out_2819353980597124361[11] = 0;
out_2819353980597124361[12] = 0;
out_2819353980597124361[13] = 0;
out_2819353980597124361[14] = 0;
out_2819353980597124361[15] = 0;
out_2819353980597124361[16] = 0;
out_2819353980597124361[17] = 0;
out_2819353980597124361[18] = 0;
out_2819353980597124361[19] = 0;
out_2819353980597124361[20] = 1;
out_2819353980597124361[21] = 0;
out_2819353980597124361[22] = 0;
out_2819353980597124361[23] = 0;
out_2819353980597124361[24] = 0;
out_2819353980597124361[25] = 0;
out_2819353980597124361[26] = 0;
out_2819353980597124361[27] = 0;
out_2819353980597124361[28] = 0;
out_2819353980597124361[29] = 0;
out_2819353980597124361[30] = 1;
out_2819353980597124361[31] = 0;
out_2819353980597124361[32] = 0;
out_2819353980597124361[33] = 0;
out_2819353980597124361[34] = 0;
out_2819353980597124361[35] = 0;
out_2819353980597124361[36] = 0;
out_2819353980597124361[37] = 0;
out_2819353980597124361[38] = 0;
out_2819353980597124361[39] = 0;
out_2819353980597124361[40] = 1;
out_2819353980597124361[41] = 0;
out_2819353980597124361[42] = 0;
out_2819353980597124361[43] = 0;
out_2819353980597124361[44] = 0;
out_2819353980597124361[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4]));
out_2819353980597124361[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2));
out_2819353980597124361[47] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_2819353980597124361[48] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_2819353980597124361[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2)));
out_2819353980597124361[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1;
out_2819353980597124361[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]));
out_2819353980597124361[52] = dt*stiffness_front*state[0]/(mass*state[1]);
out_2819353980597124361[53] = -9.8100000000000005*dt;
out_2819353980597124361[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4]));
out_2819353980597124361[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2));
out_2819353980597124361[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_2819353980597124361[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_2819353980597124361[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2)));
out_2819353980597124361[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]);
out_2819353980597124361[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1;
out_2819353980597124361[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_2819353980597124361[62] = 0;
out_2819353980597124361[63] = 0;
out_2819353980597124361[64] = 0;
out_2819353980597124361[65] = 0;
out_2819353980597124361[66] = 0;
out_2819353980597124361[67] = 0;
out_2819353980597124361[68] = 0;
out_2819353980597124361[69] = 0;
out_2819353980597124361[70] = 1;
out_2819353980597124361[71] = 0;
out_2819353980597124361[72] = 0;
out_2819353980597124361[73] = 0;
out_2819353980597124361[74] = 0;
out_2819353980597124361[75] = 0;
out_2819353980597124361[76] = 0;
out_2819353980597124361[77] = 0;
out_2819353980597124361[78] = 0;
out_2819353980597124361[79] = 0;
out_2819353980597124361[80] = 1;
}
void h_25(double *state, double *unused, double *out_319074315832850169) {
out_319074315832850169[0] = state[6];
void h_25(double *state, double *unused, double *out_6189447245513617570) {
out_6189447245513617570[0] = state[6];
}
void H_25(double *state, double *unused, double *out_3655624952681647306) {
out_3655624952681647306[0] = 0;
out_3655624952681647306[1] = 0;
out_3655624952681647306[2] = 0;
out_3655624952681647306[3] = 0;
out_3655624952681647306[4] = 0;
out_3655624952681647306[5] = 0;
out_3655624952681647306[6] = 1;
out_3655624952681647306[7] = 0;
out_3655624952681647306[8] = 0;
void H_25(double *state, double *unused, double *out_3234178458103237326) {
out_3234178458103237326[0] = 0;
out_3234178458103237326[1] = 0;
out_3234178458103237326[2] = 0;
out_3234178458103237326[3] = 0;
out_3234178458103237326[4] = 0;
out_3234178458103237326[5] = 0;
out_3234178458103237326[6] = 1;
out_3234178458103237326[7] = 0;
out_3234178458103237326[8] = 0;
}
void h_24(double *state, double *unused, double *out_5734853090591072423) {
out_5734853090591072423[0] = state[4];
out_5734853090591072423[1] = state[5];
void h_24(double *state, double *unused, double *out_7649152206074051029) {
out_7649152206074051029[0] = state[4];
out_7649152206074051029[1] = state[5];
}
void H_24(double *state, double *unused, double *out_1429917168702778744) {
out_1429917168702778744[0] = 0;
out_1429917168702778744[1] = 0;
out_1429917168702778744[2] = 0;
out_1429917168702778744[3] = 0;
out_1429917168702778744[4] = 1;
out_1429917168702778744[5] = 0;
out_1429917168702778744[6] = 0;
out_1429917168702778744[7] = 0;
out_1429917168702778744[8] = 0;
out_1429917168702778744[9] = 0;
out_1429917168702778744[10] = 0;
out_1429917168702778744[11] = 0;
out_1429917168702778744[12] = 0;
out_1429917168702778744[13] = 0;
out_1429917168702778744[14] = 1;
out_1429917168702778744[15] = 0;
out_1429917168702778744[16] = 0;
out_1429917168702778744[17] = 0;
void H_24(double *state, double *unused, double *out_7794173981929387397) {
out_7794173981929387397[0] = 0;
out_7794173981929387397[1] = 0;
out_7794173981929387397[2] = 0;
out_7794173981929387397[3] = 0;
out_7794173981929387397[4] = 1;
out_7794173981929387397[5] = 0;
out_7794173981929387397[6] = 0;
out_7794173981929387397[7] = 0;
out_7794173981929387397[8] = 0;
out_7794173981929387397[9] = 0;
out_7794173981929387397[10] = 0;
out_7794173981929387397[11] = 0;
out_7794173981929387397[12] = 0;
out_7794173981929387397[13] = 0;
out_7794173981929387397[14] = 1;
out_7794173981929387397[15] = 0;
out_7794173981929387397[16] = 0;
out_7794173981929387397[17] = 0;
}
void h_30(double *state, double *unused, double *out_8212013810717373528) {
out_8212013810717373528[0] = state[4];
void h_30(double *state, double *unused, double *out_6334967069734272541) {
out_6334967069734272541[0] = state[4];
}
void H_30(double *state, double *unused, double *out_3784963899824887376) {
out_3784963899824887376[0] = 0;
out_3784963899824887376[1] = 0;
out_3784963899824887376[2] = 0;
out_3784963899824887376[3] = 0;
out_3784963899824887376[4] = 1;
out_3784963899824887376[5] = 0;
out_3784963899824887376[6] = 0;
out_3784963899824887376[7] = 0;
out_3784963899824887376[8] = 0;
void H_30(double *state, double *unused, double *out_3104839510959997256) {
out_3104839510959997256[0] = 0;
out_3104839510959997256[1] = 0;
out_3104839510959997256[2] = 0;
out_3104839510959997256[3] = 0;
out_3104839510959997256[4] = 1;
out_3104839510959997256[5] = 0;
out_3104839510959997256[6] = 0;
out_3104839510959997256[7] = 0;
out_3104839510959997256[8] = 0;
}
void h_26(double *state, double *unused, double *out_5233056995331332443) {
out_5233056995331332443[0] = state[7];
void h_26(double *state, double *unused, double *out_1333293802073426896) {
out_1333293802073426896[0] = state[7];
}
void H_26(double *state, double *unused, double *out_2998770888571335402) {
out_2998770888571335402[0] = 0;
out_2998770888571335402[1] = 0;
out_2998770888571335402[2] = 0;
out_2998770888571335402[3] = 0;
out_2998770888571335402[4] = 0;
out_2998770888571335402[5] = 0;
out_2998770888571335402[6] = 0;
out_2998770888571335402[7] = 1;
out_2998770888571335402[8] = 0;
void H_26(double *state, double *unused, double *out_507324860770818898) {
out_507324860770818898[0] = 0;
out_507324860770818898[1] = 0;
out_507324860770818898[2] = 0;
out_507324860770818898[3] = 0;
out_507324860770818898[4] = 0;
out_507324860770818898[5] = 0;
out_507324860770818898[6] = 0;
out_507324860770818898[7] = 1;
out_507324860770818898[8] = 0;
}
void h_27(double *state, double *unused, double *out_3355860367277182854) {
out_3355860367277182854[0] = state[3];
void h_27(double *state, double *unused, double *out_7255623560535088401) {
out_7255623560535088401[0] = state[3];
}
void H_27(double *state, double *unused, double *out_5959727211625312287) {
out_5959727211625312287[0] = 0;
out_5959727211625312287[1] = 0;
out_5959727211625312287[2] = 0;
out_5959727211625312287[3] = 1;
out_5959727211625312287[4] = 0;
out_5959727211625312287[5] = 0;
out_5959727211625312287[6] = 0;
out_5959727211625312287[7] = 0;
out_5959727211625312287[8] = 0;
void H_27(double *state, double *unused, double *out_930076199159572345) {
out_930076199159572345[0] = 0;
out_930076199159572345[1] = 0;
out_930076199159572345[2] = 0;
out_930076199159572345[3] = 1;
out_930076199159572345[4] = 0;
out_930076199159572345[5] = 0;
out_930076199159572345[6] = 0;
out_930076199159572345[7] = 0;
out_930076199159572345[8] = 0;
}
void h_29(double *state, double *unused, double *out_7630324942183480437) {
out_7630324942183480437[0] = state[1];
void h_29(double *state, double *unused, double *out_3730561748925574890) {
out_3730561748925574890[0] = state[1];
}
void H_29(double *state, double *unused, double *out_3274732555510495192) {
out_3274732555510495192[0] = 0;
out_3274732555510495192[1] = 1;
out_3274732555510495192[2] = 0;
out_3274732555510495192[3] = 0;
out_3274732555510495192[4] = 0;
out_3274732555510495192[5] = 0;
out_3274732555510495192[6] = 0;
out_3274732555510495192[7] = 0;
out_3274732555510495192[8] = 0;
void H_29(double *state, double *unused, double *out_3615070855274389440) {
out_3615070855274389440[0] = 0;
out_3615070855274389440[1] = 1;
out_3615070855274389440[2] = 0;
out_3615070855274389440[3] = 0;
out_3615070855274389440[4] = 0;
out_3615070855274389440[5] = 0;
out_3615070855274389440[6] = 0;
out_3615070855274389440[7] = 0;
out_3615070855274389440[8] = 0;
}
void h_28(double *state, double *unused, double *out_4299370220178845289) {
out_4299370220178845289[0] = state[0];
void h_28(double *state, double *unused, double *out_2029716344699763454) {
out_2029716344699763454[0] = state[0];
}
void H_28(double *state, double *unused, double *out_1311102283945168941) {
out_1311102283945168941[0] = 1;
out_1311102283945168941[1] = 0;
out_1311102283945168941[2] = 0;
out_1311102283945168941[3] = 0;
out_1311102283945168941[4] = 0;
out_1311102283945168941[5] = 0;
out_1311102283945168941[6] = 0;
out_1311102283945168941[7] = 0;
out_1311102283945168941[8] = 0;
void H_28(double *state, double *unused, double *out_1180343743855347563) {
out_1180343743855347563[0] = 1;
out_1180343743855347563[1] = 0;
out_1180343743855347563[2] = 0;
out_1180343743855347563[3] = 0;
out_1180343743855347563[4] = 0;
out_1180343743855347563[5] = 0;
out_1180343743855347563[6] = 0;
out_1180343743855347563[7] = 0;
out_1180343743855347563[8] = 0;
}
void h_31(double *state, double *unused, double *out_594268378117356058) {
out_594268378117356058[0] = state[8];
void h_31(double *state, double *unused, double *out_2551997717259595220) {
out_2551997717259595220[0] = state[8];
}
void H_31(double *state, double *unused, double *out_3624978990804686878) {
out_3624978990804686878[0] = 0;
out_3624978990804686878[1] = 0;
out_3624978990804686878[2] = 0;
out_3624978990804686878[3] = 0;
out_3624978990804686878[4] = 0;
out_3624978990804686878[5] = 0;
out_3624978990804686878[6] = 0;
out_3624978990804686878[7] = 0;
out_3624978990804686878[8] = 1;
void H_31(double *state, double *unused, double *out_3264824419980197754) {
out_3264824419980197754[0] = 0;
out_3264824419980197754[1] = 0;
out_3264824419980197754[2] = 0;
out_3264824419980197754[3] = 0;
out_3264824419980197754[4] = 0;
out_3264824419980197754[5] = 0;
out_3264824419980197754[6] = 0;
out_3264824419980197754[7] = 0;
out_3264824419980197754[8] = 1;
}
#include <eigen3/Eigen/Dense>
#include <iostream>
@@ -518,68 +518,68 @@ void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, doubl
void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_31, H_31, NULL, in_z, in_R, in_ea, MAHA_THRESH_31);
}
void car_err_fun(double *nom_x, double *delta_x, double *out_4387195160971747702) {
err_fun(nom_x, delta_x, out_4387195160971747702);
void car_err_fun(double *nom_x, double *delta_x, double *out_6018065189512211380) {
err_fun(nom_x, delta_x, out_6018065189512211380);
}
void car_inv_err_fun(double *nom_x, double *true_x, double *out_7707264064834051115) {
inv_err_fun(nom_x, true_x, out_7707264064834051115);
void car_inv_err_fun(double *nom_x, double *true_x, double *out_1095263434101283480) {
inv_err_fun(nom_x, true_x, out_1095263434101283480);
}
void car_H_mod_fun(double *state, double *out_7178605602671138983) {
H_mod_fun(state, out_7178605602671138983);
void car_H_mod_fun(double *state, double *out_2728844015902940614) {
H_mod_fun(state, out_2728844015902940614);
}
void car_f_fun(double *state, double dt, double *out_2416599425795193412) {
f_fun(state, dt, out_2416599425795193412);
void car_f_fun(double *state, double dt, double *out_6525929466162239676) {
f_fun(state, dt, out_6525929466162239676);
}
void car_F_fun(double *state, double dt, double *out_6761986232654706930) {
F_fun(state, dt, out_6761986232654706930);
void car_F_fun(double *state, double dt, double *out_2819353980597124361) {
F_fun(state, dt, out_2819353980597124361);
}
void car_h_25(double *state, double *unused, double *out_319074315832850169) {
h_25(state, unused, out_319074315832850169);
void car_h_25(double *state, double *unused, double *out_6189447245513617570) {
h_25(state, unused, out_6189447245513617570);
}
void car_H_25(double *state, double *unused, double *out_3655624952681647306) {
H_25(state, unused, out_3655624952681647306);
void car_H_25(double *state, double *unused, double *out_3234178458103237326) {
H_25(state, unused, out_3234178458103237326);
}
void car_h_24(double *state, double *unused, double *out_5734853090591072423) {
h_24(state, unused, out_5734853090591072423);
void car_h_24(double *state, double *unused, double *out_7649152206074051029) {
h_24(state, unused, out_7649152206074051029);
}
void car_H_24(double *state, double *unused, double *out_1429917168702778744) {
H_24(state, unused, out_1429917168702778744);
void car_H_24(double *state, double *unused, double *out_7794173981929387397) {
H_24(state, unused, out_7794173981929387397);
}
void car_h_30(double *state, double *unused, double *out_8212013810717373528) {
h_30(state, unused, out_8212013810717373528);
void car_h_30(double *state, double *unused, double *out_6334967069734272541) {
h_30(state, unused, out_6334967069734272541);
}
void car_H_30(double *state, double *unused, double *out_3784963899824887376) {
H_30(state, unused, out_3784963899824887376);
void car_H_30(double *state, double *unused, double *out_3104839510959997256) {
H_30(state, unused, out_3104839510959997256);
}
void car_h_26(double *state, double *unused, double *out_5233056995331332443) {
h_26(state, unused, out_5233056995331332443);
void car_h_26(double *state, double *unused, double *out_1333293802073426896) {
h_26(state, unused, out_1333293802073426896);
}
void car_H_26(double *state, double *unused, double *out_2998770888571335402) {
H_26(state, unused, out_2998770888571335402);
void car_H_26(double *state, double *unused, double *out_507324860770818898) {
H_26(state, unused, out_507324860770818898);
}
void car_h_27(double *state, double *unused, double *out_3355860367277182854) {
h_27(state, unused, out_3355860367277182854);
void car_h_27(double *state, double *unused, double *out_7255623560535088401) {
h_27(state, unused, out_7255623560535088401);
}
void car_H_27(double *state, double *unused, double *out_5959727211625312287) {
H_27(state, unused, out_5959727211625312287);
void car_H_27(double *state, double *unused, double *out_930076199159572345) {
H_27(state, unused, out_930076199159572345);
}
void car_h_29(double *state, double *unused, double *out_7630324942183480437) {
h_29(state, unused, out_7630324942183480437);
void car_h_29(double *state, double *unused, double *out_3730561748925574890) {
h_29(state, unused, out_3730561748925574890);
}
void car_H_29(double *state, double *unused, double *out_3274732555510495192) {
H_29(state, unused, out_3274732555510495192);
void car_H_29(double *state, double *unused, double *out_3615070855274389440) {
H_29(state, unused, out_3615070855274389440);
}
void car_h_28(double *state, double *unused, double *out_4299370220178845289) {
h_28(state, unused, out_4299370220178845289);
void car_h_28(double *state, double *unused, double *out_2029716344699763454) {
h_28(state, unused, out_2029716344699763454);
}
void car_H_28(double *state, double *unused, double *out_1311102283945168941) {
H_28(state, unused, out_1311102283945168941);
void car_H_28(double *state, double *unused, double *out_1180343743855347563) {
H_28(state, unused, out_1180343743855347563);
}
void car_h_31(double *state, double *unused, double *out_594268378117356058) {
h_31(state, unused, out_594268378117356058);
void car_h_31(double *state, double *unused, double *out_2551997717259595220) {
h_31(state, unused, out_2551997717259595220);
}
void car_H_31(double *state, double *unused, double *out_3624978990804686878) {
H_31(state, unused, out_3624978990804686878);
void car_H_31(double *state, double *unused, double *out_3264824419980197754) {
H_31(state, unused, out_3264824419980197754);
}
void car_predict(double *in_x, double *in_P, double *in_Q, double dt) {
predict(in_x, in_P, in_Q, dt);
+21 -21
View File
@@ -9,27 +9,27 @@ void car_update_27(double *in_x, double *in_P, double *in_z, double *in_R, doubl
void car_update_29(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void car_err_fun(double *nom_x, double *delta_x, double *out_4387195160971747702);
void car_inv_err_fun(double *nom_x, double *true_x, double *out_7707264064834051115);
void car_H_mod_fun(double *state, double *out_7178605602671138983);
void car_f_fun(double *state, double dt, double *out_2416599425795193412);
void car_F_fun(double *state, double dt, double *out_6761986232654706930);
void car_h_25(double *state, double *unused, double *out_319074315832850169);
void car_H_25(double *state, double *unused, double *out_3655624952681647306);
void car_h_24(double *state, double *unused, double *out_5734853090591072423);
void car_H_24(double *state, double *unused, double *out_1429917168702778744);
void car_h_30(double *state, double *unused, double *out_8212013810717373528);
void car_H_30(double *state, double *unused, double *out_3784963899824887376);
void car_h_26(double *state, double *unused, double *out_5233056995331332443);
void car_H_26(double *state, double *unused, double *out_2998770888571335402);
void car_h_27(double *state, double *unused, double *out_3355860367277182854);
void car_H_27(double *state, double *unused, double *out_5959727211625312287);
void car_h_29(double *state, double *unused, double *out_7630324942183480437);
void car_H_29(double *state, double *unused, double *out_3274732555510495192);
void car_h_28(double *state, double *unused, double *out_4299370220178845289);
void car_H_28(double *state, double *unused, double *out_1311102283945168941);
void car_h_31(double *state, double *unused, double *out_594268378117356058);
void car_H_31(double *state, double *unused, double *out_3624978990804686878);
void car_err_fun(double *nom_x, double *delta_x, double *out_6018065189512211380);
void car_inv_err_fun(double *nom_x, double *true_x, double *out_1095263434101283480);
void car_H_mod_fun(double *state, double *out_2728844015902940614);
void car_f_fun(double *state, double dt, double *out_6525929466162239676);
void car_F_fun(double *state, double dt, double *out_2819353980597124361);
void car_h_25(double *state, double *unused, double *out_6189447245513617570);
void car_H_25(double *state, double *unused, double *out_3234178458103237326);
void car_h_24(double *state, double *unused, double *out_7649152206074051029);
void car_H_24(double *state, double *unused, double *out_7794173981929387397);
void car_h_30(double *state, double *unused, double *out_6334967069734272541);
void car_H_30(double *state, double *unused, double *out_3104839510959997256);
void car_h_26(double *state, double *unused, double *out_1333293802073426896);
void car_H_26(double *state, double *unused, double *out_507324860770818898);
void car_h_27(double *state, double *unused, double *out_7255623560535088401);
void car_H_27(double *state, double *unused, double *out_930076199159572345);
void car_h_29(double *state, double *unused, double *out_3730561748925574890);
void car_H_29(double *state, double *unused, double *out_3615070855274389440);
void car_h_28(double *state, double *unused, double *out_2029716344699763454);
void car_H_28(double *state, double *unused, double *out_1180343743855347563);
void car_h_31(double *state, double *unused, double *out_2551997717259595220);
void car_H_31(double *state, double *unused, double *out_3264824419980197754);
void car_predict(double *in_x, double *in_P, double *in_Q, double dt);
void car_set_mass(double x);
void car_set_rotational_inertia(double x);
File diff suppressed because it is too large Load Diff
+13 -13
View File
@@ -5,18 +5,18 @@ void pose_update_4(double *in_x, double *in_P, double *in_z, double *in_R, doubl
void pose_update_10(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void pose_update_13(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void pose_update_14(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void pose_err_fun(double *nom_x, double *delta_x, double *out_8207359146711228947);
void pose_inv_err_fun(double *nom_x, double *true_x, double *out_8369219426901598353);
void pose_H_mod_fun(double *state, double *out_7202306802530511060);
void pose_f_fun(double *state, double dt, double *out_4961001892384611064);
void pose_F_fun(double *state, double dt, double *out_4383751150204030030);
void pose_h_4(double *state, double *unused, double *out_878843833946471253);
void pose_H_4(double *state, double *unused, double *out_7970215192388091303);
void pose_h_10(double *state, double *unused, double *out_1191517594273352576);
void pose_H_10(double *state, double *unused, double *out_7914634342859917414);
void pose_h_13(double *state, double *unused, double *out_5300060524255047032);
void pose_H_13(double *state, double *unused, double *out_7264255055989127512);
void pose_h_14(double *state, double *unused, double *out_3965460404426586337);
void pose_H_14(double *state, double *unused, double *out_6513288024981975784);
void pose_err_fun(double *nom_x, double *delta_x, double *out_8753495689455606364);
void pose_inv_err_fun(double *nom_x, double *true_x, double *out_7040060865599254852);
void pose_H_mod_fun(double *state, double *out_2703870827941122868);
void pose_f_fun(double *state, double dt, double *out_8883447168535687566);
void pose_F_fun(double *state, double dt, double *out_5352116671186116134);
void pose_h_4(double *state, double *unused, double *out_7227081021545178632);
void pose_H_4(double *state, double *unused, double *out_496539073160347156);
void pose_h_10(double *state, double *unused, double *out_1880125658668972037);
void pose_H_10(double *state, double *unused, double *out_6033877093640339494);
void pose_h_13(double *state, double *unused, double *out_7805785120847628893);
void pose_H_13(double *state, double *unused, double *out_68062846521496948);
void pose_h_14(double *state, double *unused, double *out_5362476079090588);
void pose_H_14(double *state, double *unused, double *out_3579327505455719452);
void pose_predict(double *in_x, double *in_P, double *in_Q, double dt);
}
+13 -2
View File
@@ -8,6 +8,10 @@ from openpilot.selfdrive.monitoring.helpers import DriverMonitoring
GearShifter = structs.CarState.GearShifter
def get_rhd_override(params):
return params.get_bool("IsRHD") if params.get_bool("IsRHDOverride") else None
def dmonitoringd_thread():
config_realtime_process([0, 1, 2, 3], 5)
@@ -15,7 +19,11 @@ def dmonitoringd_thread():
pm = messaging.PubMaster(['driverMonitoringState'])
sm = messaging.SubMaster(['driverStateV2', 'liveCalibration', 'carState', 'selfdriveState', 'modelV2'], poll='driverStateV2')
DM = DriverMonitoring(rhd_saved=params.get_bool("IsRhdDetected"), always_on=params.get_bool("AlwaysOnDM"))
DM = DriverMonitoring(
rhd_saved=params.get_bool("IsRhdDetected"),
always_on=params.get_bool("AlwaysOnDM"),
rhd_override=get_rhd_override(params),
)
demo_mode=False
sm = sm.extend(['starpilotCarState'])
@@ -44,13 +52,16 @@ def dmonitoringd_thread():
# load live always-on toggle
if sm['driverStateV2'].frameId % 40 == 1:
DM.always_on = params.get_bool("AlwaysOnDM")
DM.wheel_on_right_default = params.get_bool("IsRhdDetected")
DM.wheel_on_right_override = get_rhd_override(params)
demo_mode = params.get_bool("IsDriverViewEnabled") and sm["carState"].gearShifter != GearShifter.reverse
# save rhd virtual toggle every 5 mins
if (sm['driverStateV2'].frameId % 6000 == 0 and not demo_mode and
if (DM.wheel_on_right_override is None and sm['driverStateV2'].frameId % 6000 == 0 and not demo_mode and
DM.wheelpos.prob_offseter.filtered_stat.n > DM.settings._WHEELPOS_FILTER_MIN_COUNT and
DM.wheel_on_right == (DM.wheelpos.prob_offseter.filtered_stat.M > DM.settings._WHEELPOS_THRESHOLD)):
params.put_bool_nonblocking("IsRhdDetected", DM.wheel_on_right)
params.put_bool_nonblocking("IsRHD", DM.wheel_on_right)
def main():
dmonitoringd_thread()
+7 -3
View File
@@ -141,7 +141,7 @@ def face_orientation_from_net(angles_desc, pos_desc, rpy_calib):
class DriverMonitoring:
def __init__(self, rhd_saved=False, settings=None, always_on=False):
def __init__(self, rhd_saved=False, settings=None, always_on=False, rhd_override=None):
# init policy settings
self.settings = settings if settings is not None else DRIVER_MONITOR_SETTINGS(device_type=HARDWARE.get_device_type())
@@ -159,6 +159,7 @@ class DriverMonitoring:
self.wheel_on_right = False
self.wheel_on_right_last = None
self.wheel_on_right_default = rhd_saved
self.wheel_on_right_override = rhd_override
self.face_detected = False
self.terminal_alert_cnt = 0
self.terminal_time = 0
@@ -268,12 +269,15 @@ class DriverMonitoring:
self.wheelpos.prob_offseter.push_and_update(rhd_pred)
self.wheelpos.prob_calibrated = self.wheelpos.prob_offseter.filtered_stat.n > self.settings._WHEELPOS_FILTER_MIN_COUNT
if self.wheelpos.prob_calibrated or demo_mode:
if self.wheel_on_right_override is not None and not demo_mode:
self.wheel_on_right = self.wheel_on_right_override
elif self.wheelpos.prob_calibrated or demo_mode:
self.wheel_on_right = self.wheelpos.prob_offseter.filtered_stat.M > self.settings._WHEELPOS_THRESHOLD
else:
self.wheel_on_right = self.wheel_on_right_default # use default/saved if calibration is unfinished
# make sure no switching when engaged
if op_engaged and self.wheel_on_right_last is not None and self.wheel_on_right_last != self.wheel_on_right and not demo_mode:
if (self.wheel_on_right_override is None and op_engaged and self.wheel_on_right_last is not None and
self.wheel_on_right_last != self.wheel_on_right and not demo_mode):
self.wheel_on_right = self.wheel_on_right_last
driver_data = driver_state.rightDriverData if self.wheel_on_right else driver_state.leftDriverData
if not all(len(x) > 0 for x in (driver_data.faceOrientation, driver_data.facePosition,
+9
View File
@@ -66,6 +66,15 @@ class TestMonitoring:
def _assert_no_events(self, events):
assert all(not len(e) for e in events)
def test_rhd_manual_override_beats_saved_default(self):
DM = DriverMonitoring(rhd_saved=False, rhd_override=True)
DM._update_states(msg_ATTENTIVE, [0, 0, 0], 0, False, False)
assert DM.wheel_on_right
DM = DriverMonitoring(rhd_saved=True, rhd_override=False)
DM._update_states(msg_ATTENTIVE, [0, 0, 0], 0, False, False)
assert not DM.wheel_on_right
# engaged, driver is attentive all the time
def test_fully_aware_driver(self):
events, _ = self._run_seq(always_attentive, always_false, always_true, always_false)
Binary file not shown.
+6 -1
View File
@@ -721,7 +721,12 @@ class SelfdriveD:
def main():
config_realtime_process(4, Priority.CTRL_HIGH)
# Run on core 5 (plannerd/radard, ~50% peak, FIFO prio 51) instead of sharing
# the saturated core 4 with card+controlsd. Core 4 at 100% was starving
# selfdrived's 100 Hz loop and firing selfdrivedLagging. selfdrived's higher
# FIFO prio (53 > 51) lets it preempt the 20 Hz planner/radar when needed.
# (Core 6 = camerad, core 7 = modeld are both timing-critical — avoid.)
config_realtime_process(5, Priority.CTRL_HIGH)
s = SelfdriveD()
s.run()
+2 -2
View File
@@ -23,7 +23,7 @@ if arch == "Darwin":
qt_env['CXXFLAGS'] += ["-Wno-deprecated-declarations"]
qt_util = qt_env.Library("qt_util", ["#selfdrive/ui/qt/api.cc", "#selfdrive/ui/qt/util.cc"], LIBS=base_libs)
widgets_src = ["qt/widgets/input.cc", "qt/widgets/wifi.cc", "qt/prime_state.cc",
widgets_src = ["qt/widgets/input.cc", "qt/prime_state.cc",
"qt/widgets/ssh_keys.cc", "qt/widgets/toggle.cc", "qt/widgets/controls.cc",
"qt/widgets/offroad_alerts.cc", "qt/widgets/prime.cc", "qt/widgets/keyboard.cc",
"qt/widgets/scrollview.cc", "qt/widgets/cameraview.cc", "#third_party/qrcode/QrCode.cc",
@@ -39,7 +39,7 @@ qt_libs = [widgets, qt_util] + base_libs
qt_src = ["main.cc", "ui.cc", "qt/sidebar.cc", "qt/body.cc",
"qt/window.cc", "qt/home.cc", "qt/offroad/settings.cc",
"qt/offroad/software_settings.cc", "qt/offroad/developer_panel.cc", "qt/offroad/onboarding.cc",
"qt/offroad/driverview.cc", "qt/offroad/experimental_mode.cc", "qt/offroad/firehose.cc",
"qt/offroad/driverview.cc", "qt/offroad/experimental_mode.cc",
"qt/onroad/onroad_home.cc", "qt/onroad/annotated_camera.cc", "qt/onroad/model.cc",
"qt/onroad/buttons.cc", "qt/onroad/alerts.cc", "qt/onroad/driver_monitoring.cc", "qt/onroad/hud.cc"]
-1
View File
@@ -54,7 +54,6 @@ class MainLayout(Widget):
self._sidebar.set_callbacks(on_settings=self._on_settings_clicked,
on_flag=self._on_bookmark_clicked,
open_settings=lambda: self.open_settings(PanelType.TOGGLES))
self._layouts[MainState.HOME]._setup_widget.set_open_settings_callback(lambda: self.open_settings(PanelType.FIREHOSE))
self._layouts[MainState.HOME].set_settings_callback(lambda: self.open_settings(PanelType.TOGGLES))
self._layouts[MainState.SETTINGS].set_callbacks(on_close=self._set_mode_for_state)
self._layouts[MainState.ONROAD].set_click_callback(self._on_onroad_clicked)
+20
View File
@@ -23,6 +23,7 @@ from openpilot.system.ui.widgets.scroller_tici import Scroller
DESCRIPTIONS = {
'pair_device': tr_noop("Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer."),
'driver_camera': tr_noop("Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"),
'reset_driver_monitoring': tr_noop("Clears the saved driver monitoring wheel-side calibration and any manual right-hand-driving override."),
'reset_calibration': tr_noop("openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down."),
'review_guide': tr_noop("Review the rules, features, and limitations of openpilot"),
}
@@ -61,6 +62,8 @@ class DeviceLayout(Widget):
self._pair_device_btn,
button_item(lambda: tr("Driver Camera"), lambda: tr("PREVIEW"), lambda: tr(DESCRIPTIONS['driver_camera']),
callback=self._show_driver_camera, enabled=ui_state.is_offroad),
button_item(lambda: tr("Reset Driver Monitoring"), lambda: tr("RESET"), lambda: tr(DESCRIPTIONS['reset_driver_monitoring']),
callback=self._reset_driver_monitoring_prompt, enabled=ui_state.is_offroad),
self._reset_calib_btn,
button_item(lambda: tr("Review Training Guide"), lambda: tr("REVIEW"), lambda: tr(DESCRIPTIONS['review_guide']),
self._on_review_training_guide, enabled=ui_state.is_offroad),
@@ -119,6 +122,23 @@ class DeviceLayout(Widget):
dialog = ConfirmDialog(tr("Are you sure you want to reset calibration?"), tr("Reset"))
gui_app.set_modal_overlay(dialog, callback=reset_calibration)
def _reset_driver_monitoring_prompt(self):
if ui_state.engaged:
gui_app.set_modal_overlay(alert_dialog(tr("Disengage to Reset Driver Monitoring")))
return
def reset_driver_monitoring(result: int):
if ui_state.engaged or result != DialogResult.CONFIRM:
return
self._params.remove("IsRhdDetected")
self._params.remove("IsRHD")
self._params.remove("IsRHDOverride")
self._params.put_bool("OnroadCycleRequested", True)
dialog = ConfirmDialog(tr("Are you sure you want to reset driver monitoring calibration?"), tr("Reset"))
gui_app.set_modal_overlay(dialog, callback=reset_driver_monitoring)
def _update_calib_description(self):
desc = tr(DESCRIPTIONS['reset_calibration'])
-90
View File
@@ -1,90 +0,0 @@
import pyray as rl
from openpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE
from openpilot.system.ui.lib.multilang import tr, trn, tr_noop
from openpilot.system.ui.lib.text_measure import measure_text_cached
from openpilot.system.ui.lib.scroll_panel import GuiScrollPanel
from openpilot.system.ui.lib.wrap_text import wrap_text
from openpilot.selfdrive.ui.mici.layouts.settings.firehose import FirehoseLayoutBase
TITLE = tr_noop("Firehose Mode")
DESCRIPTION = tr_noop(
"openpilot learns to drive by watching humans, like you, drive.\n\n"
+ "Firehose Mode allows you to maximize your training data uploads to improve "
+ "openpilot's driving models. More data means bigger models, which means better Experimental Mode."
)
INSTRUCTIONS = tr_noop(
"For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n\n"
+ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n\n\n"
+ "Frequently Asked Questions\n\n"
+ "Does it matter how or where I drive? Nope, just drive as you normally would.\n\n"
+ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n\n"
+ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n\n"
+ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training."
)
class FirehoseLayout(FirehoseLayoutBase):
def __init__(self):
super().__init__()
self._scroll_panel = GuiScrollPanel()
def _render(self, rect: rl.Rectangle):
# Calculate content dimensions
content_rect = rl.Rectangle(rect.x, rect.y, rect.width, self._content_height)
# Handle scrolling and render with clipping
scroll_offset = self._scroll_panel.update(rect, content_rect)
rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height))
self._content_height = self._render_content(rect, scroll_offset)
rl.end_scissor_mode()
def _render_content(self, rect: rl.Rectangle, scroll_offset: float) -> int:
x = int(rect.x + 40)
y = int(rect.y + 40 + scroll_offset)
w = int(rect.width - 80)
# Title (centered)
title_text = tr(TITLE) # live translate
title_font = gui_app.font(FontWeight.MEDIUM)
text_width = measure_text_cached(title_font, title_text, 100).x
title_x = rect.x + (rect.width - text_width) / 2
rl.draw_text_ex(title_font, title_text, rl.Vector2(round(title_x), round(y)), 100, 0, rl.WHITE)
y += 200
# Description
y = self._draw_wrapped_text(x, y, w, tr(DESCRIPTION), gui_app.font(FontWeight.NORMAL), 45, rl.WHITE)
y += 40 + 20
# Separator
rl.draw_rectangle(x, y, w, 2, self.GRAY)
y += 30 + 20
# Status
status_text, status_color = self._get_status()
y = self._draw_wrapped_text(x, y, w, status_text, gui_app.font(FontWeight.BOLD), 60, status_color)
y += 20 + 20
# Contribution count (if available)
if self._segment_count > 0:
contrib_text = trn("{} segment of your driving is in the training dataset so far.",
"{} segments of your driving is in the training dataset so far.", self._segment_count).format(self._segment_count)
y = self._draw_wrapped_text(x, y, w, contrib_text, gui_app.font(FontWeight.BOLD), 52, rl.WHITE)
y += 20 + 20
# Separator
rl.draw_rectangle(x, y, w, 2, self.GRAY)
y += 30 + 20
# Instructions
y = self._draw_wrapped_text(x, y, w, tr(INSTRUCTIONS), gui_app.font(FontWeight.NORMAL), 40, self.LIGHT_GRAY)
# bottom margin + remove effect of scroll offset
return int(round(y - self._scroll_panel.offset + 40))
def _draw_wrapped_text(self, x, y, width, text, font, font_size, color):
wrapped = wrap_text(font, text, font_size, width)
for line in wrapped:
rl.draw_text_ex(font, line, rl.Vector2(round(x), round(y)), font_size, 0, color)
y += font_size * FONT_SCALE
return round(y)
+1 -7
View File
@@ -4,7 +4,6 @@ from enum import IntEnum
from collections.abc import Callable
from openpilot.selfdrive.ui.layouts.settings.developer import DeveloperLayout
from openpilot.selfdrive.ui.layouts.settings.device import DeviceLayout
from openpilot.selfdrive.ui.layouts.settings.firehose import FirehoseLayout
from openpilot.selfdrive.ui.layouts.settings.starpilot.main_panel import StarPilotLayout
from openpilot.selfdrive.ui.layouts.settings.software import SoftwareLayout
from openpilot.selfdrive.ui.layouts.settings.toggles import TogglesLayout
@@ -37,8 +36,7 @@ class PanelType(IntEnum):
NETWORK = 2
TOGGLES = 3
SOFTWARE = 4
FIREHOSE = 5
DEVELOPER = 6
DEVELOPER = 5
@dataclass
@@ -67,7 +65,6 @@ class SettingsLayout(Widget):
PanelType.NETWORK: PanelInfo(tr_noop("Network"), NetworkUI(wifi_manager)),
PanelType.TOGGLES: PanelInfo(tr_noop("Toggles"), TogglesLayout()),
PanelType.SOFTWARE: PanelInfo(tr_noop("Software"), SoftwareLayout()),
PanelType.FIREHOSE: PanelInfo(tr_noop("Firehose"), FirehoseLayout()),
PanelType.DEVELOPER: PanelInfo(tr_noop("Developer"), DeveloperLayout()),
}
@@ -143,9 +140,6 @@ class SettingsLayout(Widget):
# Navigation buttons
y = rect.y + 300
for panel_type, panel_info in self._panels.items():
if panel_type == PanelType.FIREHOSE:
continue
button_rect = rl.Rectangle(rect.x + 50, y, rect.width - 150, NAV_BTN_HEIGHT)
# Button styling
@@ -10,7 +10,8 @@ from openpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2
from openpilot.system.ui.lib.text_measure import measure_text_cached
from openpilot.system.ui.widgets import Widget, DialogResult
from openpilot.system.ui.widgets.label import gui_label
from openpilot.selfdrive.ui.layouts.settings.starpilot.asset_loader import starpilot_texture
from openpilot.selfdrive.ui.layouts.settings.starpilot.scribble import draw_custom_icon
GEOMETRY_OFFSET = 10
@@ -226,7 +227,7 @@ class AetherListMetrics:
toggle_right_inset: int = 34
adjustor_row_height: int = 94
adjustor_row_active_height: int = 154
adjustor_preset_height: int = 30
adjustor_preset_height: int = 44
adjustor_preset_gap: int = 10
adjustor_scrubber_height: int = 52
adjustor_value_pill_height: int = 36
@@ -1149,7 +1150,7 @@ class AetherInlineRangeControl(Widget):
return
self._pending_drag = True
self._started_on_thumb = rl.check_collision_point_rec(mouse_pos, _inflate_rect(self._thumb_rect, 8, 8))
self._started_on_thumb = rl.check_collision_point_rec(mouse_pos, _inflate_rect(self._thumb_rect, 12, 12))
self._press_start = rl.Vector2(mouse_pos.x, mouse_pos.y)
def _handle_mouse_release(self, mouse_pos: MousePos):
@@ -1268,7 +1269,7 @@ class AetherInlineRangeControl(Widget):
fill_rect = _snap_rect(rl.Rectangle(self._track_rect.x, self._track_rect.y, fill_w, self._track_rect.height))
rl.draw_rectangle_rounded(fill_rect, 1.0, 12, _with_alpha(self._color, 220))
thumb_w = 18 + self._thumb_focus * 4
thumb_w = 22 + self._thumb_focus * 4
thumb_h = 28 + self._thumb_focus * 4
thumb_center_x = self._track_rect.x + fill_frac * self._track_rect.width
thumb_center_y = rect.y + rect.height / 2
@@ -1533,7 +1534,7 @@ class AetherAdjustorRow(Widget):
self._preset_rects.clear()
if self._presets:
chip_gap = 8.0
chip_gap = 12.0
chip_h = float(AETHER_LIST_METRICS.adjustor_preset_height)
chip_w = max(68.0, (rect.width - 48 - chip_gap * (len(self._presets) - 1)) / max(1, len(self._presets)))
chip_x = content_left
@@ -2338,11 +2339,14 @@ class AetherTile(Widget):
"desc_bottom": desc_y + desc_block,
}
def _draw_custom_icon(self, key: str, x: float, y: float, s: float, color: rl.Color):
draw_custom_icon(key, x, y, s, color)
def _render_tile_stack(
self,
face: rl.Rectangle,
*,
icon: rl.Texture2D | None,
icon: rl.Texture2D | None = None,
title: str,
primary: str,
desc: str,
@@ -2352,7 +2356,14 @@ class AetherTile(Widget):
title_size: int,
primary_size: int,
desc_size: int = 18,
custom_icon_key: str | None = None,
):
# Parameters for custom vector icons: base 100x100 layout footprint,
# 25% scale increase, and 60x60 canvas size defined in scribble.py coordinates.
custom_icon_base_size = 100.0
custom_icon_scale_mult = 1.25
custom_icon_canvas_size = 60.0
content_pad = SPACING.tile_content
max_w = face.width - (content_pad * 2)
scale = max(0.82, min(1.12, min(face.width / 360.0, face.height / 205.0)))
@@ -2360,8 +2371,14 @@ class AetherTile(Widget):
primary_size = max(18, int(round(primary_size * scale)))
desc_size = max(14, int(round(desc_size * scale)))
title_lines = self._wrap_text(title_font, title, max_w, title_size, max_lines=2)
icon_scale = min(0.80, max(0.56, scale * 0.72)) if icon else 0.0
icon_height = (icon.height * icon_scale) if icon else 0.0
has_icon = (icon is not None) or (custom_icon_key is not None)
icon_scale = min(0.80, max(0.56, scale * 0.72)) if has_icon else 0.0
if custom_icon_key:
icon_height = custom_icon_base_size * custom_icon_scale_mult * icon_scale
elif icon:
icon_height = icon.height * icon_scale
else:
icon_height = 0.0
desc_lines = self._wrap_text(desc_font, desc, max_w, desc_size, max_lines=3) if desc else []
layout = self._measure_tile_stack(
face,
@@ -2373,7 +2390,12 @@ class AetherTile(Widget):
desc_size=desc_size,
)
if icon:
if custom_icon_key:
icon_width = custom_icon_base_size * custom_icon_scale_mult * icon_scale
icon_x = face.x + (face.width - icon_width) / 2
s = icon_scale * (custom_icon_base_size / custom_icon_canvas_size) * custom_icon_scale_mult
self._draw_custom_icon(custom_icon_key, icon_x, layout["top"], s, rl.WHITE)
elif icon:
icon_width = icon.width * icon_scale
icon_x = face.x + (face.width - icon_width) / 2
rl.draw_texture_pro(
@@ -2427,9 +2449,8 @@ class HubTile(AetherTile):
self,
title: str | Callable[[], str],
desc: str | Callable[[], str],
icon_path: str,
icon_key: str | None = None,
on_click: Callable | None = None,
starpilot_icon: bool = False,
bg_color: rl.Color | str | None = None,
get_status: Callable[[], str] | None = None,
):
@@ -2440,13 +2461,8 @@ class HubTile(AetherTile):
self.get_status = get_status
self.title = title
self.desc = desc
if icon_path:
if starpilot_icon:
self._icon = starpilot_texture(icon_path, 100, 100)
else:
self._icon = gui_app.texture(icon_path, 100, 100)
else:
self._icon = None
self.custom_icon_key = icon_key if icon_key in ("sound", "steering", "navigate", "system", "display", "vehicle") else None
self._icon = None
self._font_title = gui_app.font(FontWeight.BOLD)
self._font_desc = gui_app.font(FontWeight.NORMAL)
@@ -2482,6 +2498,7 @@ class HubTile(AetherTile):
desc_font=self._font_desc,
title_size=30,
primary_size=18,
custom_icon_key=self.custom_icon_key,
)
@@ -2538,7 +2555,6 @@ class ToggleTile(AetherTile):
title: str,
get_state: Callable[[], bool],
set_state: Callable[[bool], None],
icon_path: str | None = None,
bg_color: rl.Color | str | None = None,
desc: str = "",
is_enabled: Callable[[], bool] | None = None,
@@ -2553,7 +2569,6 @@ class ToggleTile(AetherTile):
self.get_state = get_state
self.set_state = set_state
self.set_enabled(is_enabled or True)
self._icon = starpilot_texture(icon_path, 80, 80) if icon_path else None
self._font = gui_app.font(FontWeight.BOLD)
self._font_desc = gui_app.font(FontWeight.NORMAL)
self._active_color = self.surface_color
@@ -2587,7 +2602,6 @@ class ToggleTile(AetherTile):
self._draw_signal_edge(face, self._active_color if enabled and active else self.surface_color, width=TILE_SIGNAL_WIDTH, alpha=62 if enabled and active else 28)
self._render_tile_stack(
face,
icon=self._icon,
title=self.title,
primary=state_text,
desc=self.desc,
@@ -2605,7 +2619,6 @@ class ValueTile(AetherTile):
title: str,
get_value: Callable[[], str],
on_click: Callable,
icon_path: str | None = None,
bg_color: rl.Color | str | None = None,
is_enabled: Callable[[], bool] | None = None,
desc: str = "",
@@ -2615,7 +2628,6 @@ class ValueTile(AetherTile):
self.desc = desc
self.get_value = get_value
self.set_enabled(is_enabled or (lambda: True))
self._icon = starpilot_texture(icon_path, 80, 80) if icon_path else None
self._font = gui_app.font(FontWeight.BOLD)
self._font_desc = gui_app.font(FontWeight.NORMAL)
self._active_color = self.surface_color
@@ -2632,7 +2644,6 @@ class ValueTile(AetherTile):
self._draw_signal_edge(face, self._active_color if enabled else self._disabled_color, width=TILE_SIGNAL_WIDTH, alpha=38 if enabled else 20)
self._render_tile_stack(
face,
icon=self._icon,
title=self.title,
primary=val_text,
desc=self.desc,
@@ -2656,7 +2667,6 @@ class SliderTile(AetherTile):
min_val: float,
max_val: float,
step: float,
icon_path: str | None = None,
bg_color: rl.Color | str | None = None,
is_enabled: Callable[[], bool] | None = None,
desc: str = "",
@@ -2676,7 +2686,6 @@ class SliderTile(AetherTile):
self.labels = labels or {}
self.on_test = on_test
self.set_enabled(is_enabled or (lambda: True))
self._icon = starpilot_texture(icon_path, 80, 80) if icon_path else None
self._font = gui_app.font(FontWeight.BOLD)
self._font_desc = gui_app.font(FontWeight.NORMAL)
self._active_color = self.surface_color
@@ -2775,7 +2784,6 @@ class SliderTile(AetherTile):
val_str = self.labels.get(current_val, f"{int(current_val)}{self.unit}")
self._render_tile_stack(
face,
icon=self._icon,
title=self.title,
primary=val_str,
desc=self.desc,
@@ -3053,91 +3061,288 @@ class AetherSliderDialog(Widget):
step: float,
current_val: float,
on_close: Callable,
presets: list[float] | None = None,
unit: str = "",
labels: dict[float, str] | None = None,
color: rl.Color | str = "#F57371",
on_change: Callable[[float], None] | None = None,
):
super().__init__()
self.title, self._user_callback = title, on_close
self._on_change = on_change
self._color = hex_to_color(color) if isinstance(color, str) else color
self._font_title, self._font_btn = gui_app.font(FontWeight.BOLD), gui_app.font(FontWeight.BOLD)
self._slider = AetherSlider(min_val, max_val, step, current_val, self._on_slider_change, unit, labels, self._color)
self._current_val, self._is_pressed_ok, self._is_pressed_cancel = current_val, False, False
self._ok_offset: float = 0.0
self._cancel_offset: float = 0.0
self._ok_target: float = 0.0
self._cancel_target: float = 0.0
self._font_value = gui_app.font(FontWeight.BOLD)
self._current_val = current_val
self.min_val = min_val
self.max_val = max_val
self.step = step
self._presets = presets or []
self._unit = unit
self._labels = labels or {}
self._preset_rects: list[tuple[float, rl.Rectangle]] = []
self._pressed_zone: str | None = None
self._is_pressed_ok = False
self._is_pressed_cancel = False
self._ok_offset = 0.0
self._cancel_offset = 0.0
self._ok_target = 0.0
self._cancel_target = 0.0
self._is_dragging = False
self._val_on_press = current_val
def _on_slider_change(self, val):
self._current_val = val
self._ok_rect = rl.Rectangle(0, 0, 0, 0)
self._cancel_rect = rl.Rectangle(0, 0, 0, 0)
self._minus_rect = rl.Rectangle(0, 0, 0, 0)
self._plus_rect = rl.Rectangle(0, 0, 0, 0)
self._track_rect = rl.Rectangle(0, 0, 0, 0)
self._thumb_rect = rl.Rectangle(0, 0, 0, 0)
def _value_fraction(self, value: float) -> float:
val_range = self.max_val - self.min_val
if val_range == 0:
return 0.0
return max(0.0, min(1.0, (value - self.min_val) / val_range))
def _clamp_and_snap(self, val: float) -> float:
if self.step <= 0:
return max(self.min_val, min(self.max_val, val))
snapped = round((val - self.min_val) / self.step) * self.step + self.min_val
return max(self.min_val, min(self.max_val, snapped))
def _update_val_from_mouse(self, mouse_pos: MousePos) -> None:
if self._track_rect.width <= 0:
return
rel_x = max(0.0, min(1.0, (mouse_pos.x - self._track_rect.x) / self._track_rect.width))
val = self.min_val + rel_x * (self.max_val - self.min_val)
self._current_val = self._clamp_and_snap(val)
def formatted_value(self) -> str:
return format_adjustor_value(self._current_val, step=self.step, unit=self._unit, labels=self._labels)
def _handle_mouse_press(self, mouse_pos: MousePos):
self._slider._handle_mouse_press(mouse_pos)
self._val_on_press = self._current_val
if rl.check_collision_point_rec(mouse_pos, self._ok_rect):
self._is_pressed_ok = True
self._ok_target = 1.0
return
if rl.check_collision_point_rec(mouse_pos, self._cancel_rect):
self._is_pressed_cancel = True
self._cancel_target = 1.0
return
for value, preset_rect in self._preset_rects:
if rl.check_collision_point_rec(mouse_pos, preset_rect):
self._pressed_zone = f"preset:{value}"
return
if rl.check_collision_point_rec(mouse_pos, self._minus_rect):
self._pressed_zone = "minus"
return
if rl.check_collision_point_rec(mouse_pos, self._plus_rect):
self._pressed_zone = "plus"
return
hit_track = _inflate_rect(self._track_rect, 0, 24)
if rl.check_collision_point_rec(mouse_pos, hit_track):
self._is_dragging = True
self._update_val_from_mouse(mouse_pos)
return
def _handle_mouse_release(self, mouse_pos: MousePos):
self._slider._handle_mouse_release(mouse_pos)
is_ok = self._is_pressed_ok
is_cancel = self._is_pressed_cancel
if self._is_pressed_ok:
self._ok_target = 0.0
if rl.check_collision_point_rec(mouse_pos, self._ok_rect):
gui_app.pop_widget()
self._user_callback(DialogResult.CONFIRM, self._current_val)
self._is_pressed_ok = False
if self._is_pressed_cancel:
elif self._is_pressed_cancel:
self._cancel_target = 0.0
if rl.check_collision_point_rec(mouse_pos, self._cancel_rect):
gui_app.pop_widget()
self._user_callback(DialogResult.CANCEL, self._current_val)
self._is_pressed_cancel = False
elif self._pressed_zone:
if self._pressed_zone.startswith("preset:"):
try:
preset_value = float(self._pressed_zone.split(":", 1)[1])
except ValueError:
preset_value = None
if preset_value is not None:
for value, preset_rect in self._preset_rects:
if value == preset_value and rl.check_collision_point_rec(mouse_pos, preset_rect):
self._current_val = preset_value
break
elif self._pressed_zone == "minus":
if rl.check_collision_point_rec(mouse_pos, self._minus_rect):
self._current_val = self._clamp_and_snap(self._current_val - self.step)
elif self._pressed_zone == "plus":
if rl.check_collision_point_rec(mouse_pos, self._plus_rect):
self._current_val = self._clamp_and_snap(self._current_val + self.step)
self._pressed_zone = None
if self._is_dragging:
self._is_dragging = False
if not is_ok and not is_cancel:
if self._current_val != self._val_on_press and self._on_change:
self._on_change(self._current_val)
def _handle_mouse_event(self, mouse_event):
if self._is_dragging:
self._update_val_from_mouse(mouse_event.pos)
def _render_preset_chip(self, rect: rl.Rectangle, text: str, *, current: bool, pressed: bool):
fill = rl.Color(255, 255, 255, 5)
border = rl.Color(255, 255, 255, 14)
text_color = AetherListColors.SUBTEXT
if current:
fill = _mix_colors(rl.Color(18, 22, 28, 255), self._color, 0.22, alpha=255)
border = _with_alpha(self._color, 72)
text_color = AetherListColors.HEADER
elif pressed:
fill = rl.Color(255, 255, 255, 10)
border = rl.Color(255, 255, 255, 22)
_draw_rounded_fill(rect, fill, radius_px=16)
_draw_rounded_stroke(rect, border, radius_px=16)
_draw_text_fit_common(
gui_app.font(FontWeight.MEDIUM),
text,
rl.Vector2(rect.x + 10, rect.y + (rect.height - 24) / 2),
max(1.0, rect.width - 20),
24,
align_center=True,
color=text_color,
)
def _render(self, rect: rl.Rectangle):
dt = rl.get_frame_time()
self._ok_offset += (self._ok_target - self._ok_offset) * (1 - math.exp(-dt / PLATE_TAU))
self._cancel_offset += (self._cancel_target - self._cancel_offset) * (1 - math.exp(-dt / PLATE_TAU))
rl.draw_rectangle(0, 0, gui_app.width, gui_app.height, rl.Color(0, 0, 0, 160))
dialog_margin = SPACING.xxl
dialog_w = min(1000, max(640, rect.width - dialog_margin * 2))
dialog_h = min(500, max(360, rect.height - dialog_margin * 2))
button_height = min(80, max(64, int(dialog_h * 0.16)))
button_width = min(350, max(180, int((dialog_w - SPACING.lg * 3) / 2)))
has_presets = len(self._presets) > 0
dialog_w = 1200
dialog_h = 720 if has_presets else 580
button_height = 96
button_width = 440
dx, dy = rect.x + (rect.width - dialog_w) / 2, rect.y + (rect.height - dialog_h) / 2
self._ok_rect = rl.Rectangle(dx + dialog_w - button_width - SPACING.lg, dy + dialog_h - button_height - SPACING.lg, button_width, button_height)
self._cancel_rect = rl.Rectangle(dx + SPACING.lg, dy + dialog_h - button_height - SPACING.lg, button_width, button_height)
self._ok_rect = rl.Rectangle(dx + dialog_w - button_width - 64, dy + dialog_h - button_height - 48, button_width, button_height)
self._cancel_rect = rl.Rectangle(dx + 64, dy + dialog_h - button_height - 48, button_width, button_height)
d_rect = _snap_rect(rl.Rectangle(dx, dy, dialog_w, dialog_h))
_draw_rounded_fill(d_rect, rl.Color(13, 16, 22, 255), radius_px=24)
_draw_rounded_stroke(d_rect, rl.Color(255, 255, 255, 24), radius_px=24)
rl.draw_rectangle_rec(rl.Rectangle(d_rect.x, d_rect.y, d_rect.width, 2), _with_alpha(self._color, 40))
title_size = max(30, min(50, int(dialog_w * 0.05)))
_draw_rounded_fill(d_rect, rl.Color(10, 12, 16, 255), radius_px=24)
_draw_rounded_stroke(d_rect, rl.Color(255, 255, 255, 16), radius_px=24)
rl.draw_rectangle_rec(rl.Rectangle(d_rect.x, d_rect.y, d_rect.width, 3), self._color)
title_size = 36
ts = measure_text_cached(self._font_title, self.title, title_size)
rl.draw_text_ex(self._font_title, self.title, rl.Vector2(round(dx + (dialog_w - ts.x) / 2), round(dy + SPACING.xxl)), title_size, 0, rl.WHITE)
slider_y = dy + max(120, int(dialog_h * 0.38))
slider_h = min(100, max(72, int(dialog_h * 0.22)))
slider_rect = rl.Rectangle(dx + SPACING.xxl, slider_y, dialog_w - (SPACING.xxl * 2), slider_h)
self._slider.render(slider_rect)
rl.draw_text_ex(self._font_title, self.title, rl.Vector2(round(dx + (dialog_w - ts.x) / 2), round(dy + 48)), title_size, 0, rl.WHITE)
# Large value display below title
val_str = self.formatted_value()
val_size = 72
vts = measure_text_cached(self._font_value, val_str, val_size)
rl.draw_text_ex(self._font_value, val_str, rl.Vector2(round(dx + (dialog_w - vts.x) / 2), round(dy + 120)), val_size, 0, self._color)
# Render presets below the value display (if any)
presets_y = dy + 230
self._preset_rects.clear()
if has_presets:
chip_h = 68.0
chip_gap = 20.0
chip_w = max(90.0, (dialog_w - 64 * 2 - chip_gap * (len(self._presets) - 1)) / max(1, len(self._presets)))
for index, val in enumerate(self._presets):
chip_x = dx + 64 + index * (chip_w + chip_gap)
chip_rect = _snap_rect(rl.Rectangle(chip_x, presets_y, chip_w, chip_h))
self._preset_rects.append((val, chip_rect))
formatted_label = format_adjustor_value(val, step=self.step, unit=self._unit, labels=self._labels)
self._render_preset_chip(
chip_rect,
formatted_label,
current=abs(self._current_val - val) <= 0.5 * self.step,
pressed=self._pressed_zone == f"preset:{val}",
)
slider_y = dy + 390
else:
slider_y = dy + 270
# Slider
btn_size = 80
self._minus_rect = _snap_rect(rl.Rectangle(dx + 64, slider_y - btn_size / 2, btn_size, btn_size))
self._plus_rect = _snap_rect(rl.Rectangle(dx + dialog_w - 64 - btn_size, slider_y - btn_size / 2, btn_size, btn_size))
# Draw minus button
minus_pressed = self._pressed_zone == "minus"
_draw_rounded_fill(self._minus_rect, rl.Color(255, 255, 255, 14 if minus_pressed else 8), radius_px=40)
_draw_rounded_stroke(self._minus_rect, rl.Color(255, 255, 255, 28 if minus_pressed else 18), radius_px=40)
mts = measure_text_cached(self._font_btn, "-", 32)
rl.draw_text_ex(self._font_btn, "-", rl.Vector2(round(self._minus_rect.x + (btn_size - mts.x) / 2), round(self._minus_rect.y + (btn_size - mts.y) / 2)), 32, 0, rl.WHITE)
# Draw plus button
plus_pressed = self._pressed_zone == "plus"
_draw_rounded_fill(self._plus_rect, rl.Color(255, 255, 255, 14 if plus_pressed else 8), radius_px=40)
_draw_rounded_stroke(self._plus_rect, rl.Color(255, 255, 255, 28 if plus_pressed else 18), radius_px=40)
pts = measure_text_cached(self._font_btn, "+", 32)
rl.draw_text_ex(self._font_btn, "+", rl.Vector2(round(self._plus_rect.x + (btn_size - pts.x) / 2), round(self._plus_rect.y + (btn_size - pts.y) / 2)), 32, 0, rl.WHITE)
# Draw track
track_x = self._minus_rect.x + btn_size + 36
track_w = self._plus_rect.x - 36 - track_x
track_h = 10
track_y = slider_y - track_h / 2
self._track_rect = _snap_rect(rl.Rectangle(track_x, track_y, track_w, track_h))
_draw_rounded_fill(self._track_rect, rl.Color(255, 255, 255, 14), radius_px=5)
_draw_rounded_stroke(self._track_rect, rl.Color(255, 255, 255, 8), radius_px=5)
# Draw ticks at preset values (or custom ticks if no presets)
ticks_to_draw = self._presets
if not has_presets:
ticks_to_draw = [self.min_val, (self.min_val + self.max_val) / 2, self.max_val]
for val in ticks_to_draw:
frac = self._value_fraction(val)
tick_x = track_x + frac * track_w
rl.draw_rectangle_rec(rl.Rectangle(tick_x - 1, track_y - 7, 2, 24), rl.Color(255, 255, 255, 28))
# Draw active fill
fill_frac = self._value_fraction(self._current_val)
fill_w = fill_frac * track_w
if fill_w > 0:
fill_rect = _snap_rect(rl.Rectangle(track_x, track_y, fill_w, track_h))
_draw_rounded_fill(fill_rect, self._color, radius_px=5)
# Draw thumb
thumb_w = 24
thumb_h = 48
thumb_x = track_x + fill_frac * track_w
self._thumb_rect = _snap_rect(rl.Rectangle(thumb_x - thumb_w / 2, slider_y - thumb_h / 2, thumb_w, thumb_h))
_draw_rounded_fill(self._thumb_rect, rl.WHITE, radius_px=12)
_draw_rounded_stroke(self._thumb_rect, rl.Color(20, 22, 28, 46), radius_px=12)
# Cancel Button
c_face_x = self._cancel_rect.x
c_face_y = self._cancel_rect.y + min(1.0, GEOMETRY_OFFSET * self._cancel_offset * 0.1)
c_face = _snap_rect(rl.Rectangle(c_face_x, c_face_y, button_width, button_height))
_draw_rounded_fill(c_face, rl.Color(34, 38, 48, 255), radius_px=16)
_draw_rounded_stroke(c_face, rl.Color(255, 255, 255, 24), radius_px=16)
rl.draw_rectangle_rec(rl.Rectangle(c_face.x, c_face.y, c_face.width, 1), rl.Color(255, 255, 255, 12))
button_text_size = max(24, min(35, int(button_height * 0.42)))
cts = measure_text_cached(self._font_btn, tr("CANCEL"), button_text_size)
cancel_text_pos = rl.Vector2(c_face_x + (button_width - cts.x) / 2, c_face_y + (button_height - cts.y) / 2)
rl.draw_text_ex(self._font_btn, tr("CANCEL"), rl.Vector2(round(cancel_text_pos.x), round(cancel_text_pos.y)), button_text_size, 0, rl.WHITE)
_draw_rounded_fill(c_face, rl.Color(34, 38, 48, 255), radius_px=24)
_draw_rounded_stroke(c_face, rl.Color(255, 255, 255, 20), radius_px=24)
cts = measure_text_cached(self._font_btn, tr("CANCEL"), 28)
rl.draw_text_ex(self._font_btn, tr("CANCEL"), rl.Vector2(round(c_face_x + (button_width - cts.x) / 2), round(c_face_y + (button_height - cts.y) / 2)), 28, 0, rl.WHITE)
# OK Button
o_face_x = self._ok_rect.x
o_face_y = self._ok_rect.y + min(1.0, GEOMETRY_OFFSET * self._ok_offset * 0.1)
o_face = _snap_rect(rl.Rectangle(o_face_x, o_face_y, button_width, button_height))
_draw_rounded_fill(o_face, _mix_colors(rl.Color(34, 38, 48, 255), self._color, 0.40), radius_px=16)
_draw_rounded_stroke(o_face, _with_alpha(self._color, 130), radius_px=16)
rl.draw_rectangle_rec(rl.Rectangle(o_face.x, o_face.y, o_face.width, 1), rl.Color(255, 255, 255, 18))
ots = measure_text_cached(self._font_btn, tr("OK"), button_text_size)
ok_text_pos = rl.Vector2(o_face_x + (button_width - ots.x) / 2, o_face_y + (button_height - ots.y) / 2)
rl.draw_text_ex(self._font_btn, tr("OK"), rl.Vector2(round(ok_text_pos.x), round(ok_text_pos.y)), button_text_size, 0, rl.WHITE)
_draw_rounded_fill(o_face, self._color, radius_px=24)
_draw_rounded_stroke(o_face, _with_alpha(self._color, 150), radius_px=24)
ots = measure_text_cached(self._font_btn, tr("OK"), 28)
rl.draw_text_ex(self._font_btn, tr("OK"), rl.Vector2(round(o_face_x + (button_width - ots.x) / 2), round(o_face_y + (button_height - ots.y) / 2)), 28, 0, rl.WHITE)
return DialogResult.NO_ACTION
@@ -3228,6 +3433,7 @@ class AetherSegmentedControl(Widget):
on_change: Callable[[int], None],
statuses: list[str | Callable[[], str] | None] | None = None,
compact: bool = False,
style: PanelStyle | None = None,
):
super().__init__()
self._options = options
@@ -3237,6 +3443,7 @@ class AetherSegmentedControl(Widget):
if len(self._statuses) < len(self._options):
self._statuses += [""] * (len(self._options) - len(self._statuses))
self._compact = compact
self._style = style
self._font = gui_app.font(FontWeight.BOLD)
self._font_status = gui_app.font(FontWeight.NORMAL)
self._pressed_index = -1
@@ -3325,8 +3532,18 @@ class AetherSegmentedControl(Widget):
face_rect = _snap_rect(rl.Rectangle(base_rect.x, base_rect.y + min(1.0, offset), base_rect.width, base_rect.height))
is_active = i == current_index
fill = rl.Color(255, 255, 255, 12) if is_active else rl.Color(255, 255, 255, 3)
border = rl.Color(255, 255, 255, 30) if is_active else rl.Color(255, 255, 255, 8)
if self._style is not None:
accent = self._style.accent
fill = _mix_colors(rl.Color(18, 22, 28, 255), accent, 0.16, alpha=255) if is_active else rl.Color(255, 255, 255, 3)
border = _with_alpha(accent, 72) if is_active else rl.Color(255, 255, 255, 8)
title_color = accent if is_active else AetherListColors.SUBTEXT
status_color = _mix_colors(accent, AetherListColors.HEADER, 0.4) if is_active else AetherListColors.MUTED
else:
fill = rl.Color(255, 255, 255, 12) if is_active else rl.Color(255, 255, 255, 3)
border = rl.Color(255, 255, 255, 30) if is_active else rl.Color(255, 255, 255, 8)
title_color = AetherListColors.HEADER if is_active else AetherListColors.SUBTEXT
status_color = AetherListColors.MUTED
_draw_rounded_fill(face_rect, fill, radius_px=16)
_draw_rounded_stroke(face_rect, border, radius_px=16)
rl.draw_rectangle_rec(rl.Rectangle(face_rect.x, face_rect.y, face_rect.width, 1), rl.Color(255, 255, 255, 18 if is_active else 10))
@@ -3335,7 +3552,6 @@ class AetherSegmentedControl(Widget):
status = str(_resolve_value(self._statuses[i], ""))
title_size = max(18, min(24, int(face_rect.height * (0.28 if has_status else 0.36))))
status_size = max(14, min(17, int(face_rect.height * 0.22)))
title_color = AetherListColors.HEADER if is_active else AetherListColors.SUBTEXT
if has_status:
title_y = face_rect.y + max(9.0, min(14.0, face_rect.height * 0.18))
@@ -3356,7 +3572,7 @@ class AetherSegmentedControl(Widget):
face_rect.width - 32,
status_size,
align_center=True,
color=AetherListColors.MUTED,
color=status_color,
)
else:
_draw_text_fit_common(
@@ -3469,9 +3685,9 @@ class TileGrid(Widget):
tile_idx += 1
def draw_toggle_pill(rect: rl.Rectangle, is_on: bool, is_enabled: bool, title: str, status_str: str, hovered: bool, pressed: bool, style: PanelStyle = DEFAULT_PANEL_STYLE):
def draw_toggle_pill(rect: rl.Rectangle, is_on: bool, is_enabled: bool, title: str, status_str: str, hovered: bool, pressed: bool, style: PanelStyle = DEFAULT_PANEL_STYLE, *, subtitle: str = ""):
rect = _snap_rect(rect)
bg_color = rl.Color(28, 32, 40, 170 if not is_enabled else 255)
bg_color = rl.Color(28, 32, 40, 200 if not is_enabled else 255)
accent = style.accent if is_on and is_enabled else rl.Color(255, 255, 255, 52 if is_enabled else 20)
_draw_rounded_fill(rect, bg_color, radius_px=18)
_draw_rounded_stroke(rect, _with_alpha(accent, 92 if is_on and is_enabled else accent.a), radius_px=18)
@@ -3486,9 +3702,17 @@ def draw_toggle_pill(rect: rl.Rectangle, is_on: bool, is_enabled: bool, title: s
font = gui_app.font(FontWeight.BOLD)
title_size = max(16, min(22, int(rect.height * 0.26)))
status_size = max(18, min(24, int(rect.height * 0.32)))
title_y = rect.y + (rect.height - title_size) / 2
rl.draw_text_ex(font, title, rl.Vector2(round(rect.x + 24), round(title_y)), title_size, 0, AetherListColors.SUBTEXT if is_enabled else AetherListColors.MUTED)
if subtitle:
title_y = rect.y + (rect.height - title_size - 18) / 2
rl.draw_text_ex(font, title, rl.Vector2(round(rect.x + 24), round(title_y)), title_size, 0, AetherListColors.SUBTEXT if is_enabled else AetherListColors.MUTED)
sub_font = gui_app.font(FontWeight.NORMAL)
sub_size = max(12, min(16, int(rect.height * 0.18)))
rl.draw_text_ex(sub_font, subtitle, rl.Vector2(round(rect.x + 24), round(title_y + title_size + 2)), sub_size, 0, AetherListColors.MUTED)
else:
title_y = rect.y + (rect.height - title_size) / 2
rl.draw_text_ex(font, title, rl.Vector2(round(rect.x + 24), round(title_y)), title_size, 0, AetherListColors.SUBTEXT if is_enabled else AetherListColors.MUTED)
ts = measure_text_cached(font, status_str, status_size)
status_x = rect.x + rect.width - ts.x - 24
rl.draw_text_ex(font, status_str, rl.Vector2(round(status_x), round(rect.y + (rect.height - ts.y) / 2)), status_size, 0, AetherListColors.HEADER if is_enabled else AetherListColors.MUTED)

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