diff --git a/opendbc_repo/opendbc/safety/modes/body.h b/opendbc_repo/opendbc/safety/modes/body.h index 00d05bd0e5..7ab29a1a16 100644 --- a/opendbc_repo/opendbc/safety/modes/body.h +++ b/opendbc_repo/opendbc/safety/modes/body.h @@ -43,7 +43,7 @@ static bool body_tx_hook(const CANPacket_t *msg) { } static safety_config body_init(uint16_t param) { - static RxCheck body_rx_checks[] = { + static const RxCheck body_rx_checks[] = { {.msg = {{0x201, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, }; diff --git a/opendbc_repo/opendbc/safety/modes/byd.h b/opendbc_repo/opendbc/safety/modes/byd.h index df00939bd0..2e53c53eb6 100644 --- a/opendbc_repo/opendbc/safety/modes/byd.h +++ b/opendbc_repo/opendbc/safety/modes/byd.h @@ -99,7 +99,7 @@ static safety_config byd_init(uint16_t param) { {0x3B0, 0, 8, .check_relay = false}, // PCM_BUTTONS (cruise cancel button spoof) }; - static RxCheck byd_rx_checks[] = { + static const RxCheck byd_rx_checks[] = { {.msg = {{0x11F, 0, 5, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // STEER_MODULE_2 (steering angle) {.msg = {{0x1F0, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // WHEELSPEED_CLEAN (vehicle speed) {.msg = {{0x242, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // DRIVE_STATE (gas and brake pressed) diff --git a/opendbc_repo/opendbc/safety/modes/chrysler.h b/opendbc_repo/opendbc/safety/modes/chrysler.h index f091cdb1f6..94d92ca921 100644 --- a/opendbc_repo/opendbc/safety/modes/chrysler.h +++ b/opendbc_repo/opendbc/safety/modes/chrysler.h @@ -196,7 +196,7 @@ static safety_config chrysler_init(uint16_t param) { chrysler_hold_stock_timestamp = 0U; for (int i = 0; i < 8; i++) { chrysler_hold_stock[i] = 0U; } - static RxCheck chrysler_ram_dt_rx_checks[] = { + static const RxCheck chrysler_ram_dt_rx_checks[] = { {.msg = {{CHRYSLER_RAM_DT_EPS_2, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{CHRYSLER_RAM_DT_ESP_1, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{CHRYSLER_RAM_DT_ESP_8, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, @@ -204,7 +204,7 @@ static safety_config chrysler_init(uint16_t param) { {.msg = {{CHRYSLER_RAM_DT_DAS_3, 2, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, }; - static RxCheck chrysler_rx_checks[] = { + static const RxCheck chrysler_rx_checks[] = { {.msg = {{CHRYSLER_EPS_2, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{CHRYSLER_ESP_1, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{514, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, @@ -232,7 +232,7 @@ static safety_config chrysler_init(uint16_t param) { }; #ifdef ALLOW_DEBUG - static RxCheck chrysler_ram_hd_rx_checks[] = { + static const RxCheck chrysler_ram_hd_rx_checks[] = { {.msg = {{CHRYSLER_RAM_HD_EPS_2, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{CHRYSLER_RAM_HD_ESP_1, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{CHRYSLER_RAM_HD_ESP_8, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/chrysler_cusw.h b/opendbc_repo/opendbc/safety/modes/chrysler_cusw.h index f3009e9da7..4bf7eff7d4 100644 --- a/opendbc_repo/opendbc/safety/modes/chrysler_cusw.h +++ b/opendbc_repo/opendbc/safety/modes/chrysler_cusw.h @@ -9,7 +9,7 @@ static safety_config chrysler_cusw_init(uint16_t param) { {0x2FAU, 0, 3, .check_relay = false}, }; - static RxCheck chrysler_cusw_rx_checks[] = { + static const RxCheck chrysler_cusw_rx_checks[] = { {.msg = {{0x1E4U, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{0x1E8U, 0, 5, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{0x1ECU, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/ford.h b/opendbc_repo/opendbc/safety/modes/ford.h index a415289742..7d792e5a50 100644 --- a/opendbc_repo/opendbc/safety/modes/ford.h +++ b/opendbc_repo/opendbc/safety/modes/ford.h @@ -444,13 +444,16 @@ static safety_config ford_init(uint16_t configured_param) { const bool manual_valid = !manual || ford_aol_param_valid(configured_param); // warning: quality flags are not yet checked in openpilot's CAN parser, // this may be the cause of blocked messages - // Shared entries preserve all current checksum/counter/quality contracts. - #define FORD_COMMON_RX_CHECKS \ - {.msg = {{FORD_BrakeSysFeatures, 0, 8, 50U, .max_counter = 15U}, { 0 }, { 0 }}}, \ - {.msg = {{FORD_EngVehicleSpThrottle2, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, \ - {.msg = {{FORD_Yaw_Data_FD1, 0, 8, 100U, .max_counter = 255U}, { 0 }, { 0 }}}, \ - {.msg = {{FORD_EngBrakeData, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ - {.msg = {{FORD_EngVehicleSpThrottle, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ + static const RxCheck ford_rx_checks[] = { + {.msg = {{FORD_BrakeSysFeatures, 0, 8, 50U, .max_counter = 15U}, { 0 }, { 0 }}}, + // FORD_EngVehicleSpThrottle2 has a counter that either randomly skips or by 2, likely ECU bug + // Some hybrid models also experience a bug where this checksum mismatches for one or two frames under heavy acceleration with ACC + // It has been confirmed that the Bronco Sport's camera only disallows ACC for bad quality flags, not counters or checksums, so we match that + {.msg = {{FORD_EngVehicleSpThrottle2, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, + {.msg = {{FORD_Yaw_Data_FD1, 0, 8, 100U, .max_counter = 255U}, { 0 }, { 0 }}}, + // These messages have no counter or checksum + {.msg = {{FORD_EngBrakeData, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, + {.msg = {{FORD_EngVehicleSpThrottle, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{FORD_DesiredTorqBrk, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, static RxCheck ford_rx_checks[] = { FORD_COMMON_RX_CHECKS }; static RxCheck ford_lka_rx_checks[] = { diff --git a/opendbc_repo/opendbc/safety/modes/gm.h b/opendbc_repo/opendbc/safety/modes/gm.h index 5af417f35c..92150e717f 100644 --- a/opendbc_repo/opendbc/safety/modes/gm.h +++ b/opendbc_repo/opendbc/safety/modes/gm.h @@ -1160,7 +1160,7 @@ static safety_config gm_init(uint16_t safety_param) { gm_extended_rx_checks[3].msg[0].addr = (gm_camera_pedal && !gm_camera_pedal_f1) ? 0xBEU : 0xF1U; - static RxCheck gm_rx_checks[] = { + static const RxCheck gm_rx_checks[] = { GM_COMMON_RX_CHECKS }; #define GM_ASCM_INTERCEPT_RX_CHECKS \ @@ -1237,7 +1237,7 @@ static safety_config gm_init(uint16_t safety_param) { {.msg = {{0x1F5, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, }; - static RxCheck gm_ev_rx_checks[] = { + static const RxCheck gm_ev_rx_checks[] = { GM_COMMON_RX_CHECKS {.msg = {{0xBD, 0, 7, 40U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, }; diff --git a/opendbc_repo/opendbc/safety/modes/hyundai.h b/opendbc_repo/opendbc/safety/modes/hyundai.h index 0adec32964..22cf85a6a3 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai.h @@ -668,88 +668,9 @@ static safety_config hyundai_init(uint16_t param) { hyundai_legacy = false; safety_config ret; -#ifdef ALLOW_DEBUG - if (hyundai_blended_alpha) { - static const CanMsg alpha_hda1_tx[] = { - {0x340, 0, 8, .check_relay = true, .disable_static_blocking = true}, - {0x485, 0, 8, .check_relay = true, .disable_static_blocking = true}, - {0x364, 0, 8, .check_relay = true, .disable_static_blocking = true}, {0x420, 0, 8, .check_relay = true}, - {0x421, 0, 8, .check_relay = true}, {0x389, 0, 8, .check_relay = true}, - {0x7D0, 0, 8, .check_relay = false}, {0x363, 0, 8, .check_relay = false}, - {0x398, 0, 8, .check_relay = false}, - }; - static const CanMsg alpha_hda2_tx[] = { - {0x50, 0, 16, .check_relay = true, .disable_static_blocking = true}, - {0x2A4, 0, 24, .check_relay = true, .disable_static_blocking = true}, - {0x51, 0, 32, .check_relay = false}, {0x730, 1, 8, .check_relay = false}, - {0x340, 1, 8, .check_relay = true, .disable_static_blocking = true}, - {0x485, 1, 8, .check_relay = true, .disable_static_blocking = true}, - {0x420, 1, 8, .check_relay = true}, {0x421, 1, 8, .check_relay = true}, - {0x389, 1, 8, .check_relay = true}, {0x38D, 1, 8, .check_relay = false}, - {0x363, 1, 8, .check_relay = false}, - {0x398, 1, 8, .check_relay = false}, {0x399, 1, 8, .check_relay = false}, - {0x39A, 1, 8, .check_relay = false}, {0x39B, 1, 8, .check_relay = false}, - {0x39C, 1, 8, .check_relay = false}, {0x43A, 1, 8, .check_relay = false}, - }; - if (hyundai_blended_hda2) { - static RxCheck alpha_hda2_rx[] = { - HYUNDAI_BLENDED_ALPHA_RX_CHECKS(1, 50U) - {.msg = {{0x2A4, 2, 24, 20U, .max_counter = 255U, .ignore_quality_flag = true}, {0}, {0}}}, - }; - ret = BUILD_SAFETY_CFG(alpha_hda2_rx, alpha_hda2_tx); - } else { - static RxCheck alpha_hda1_rx[] = { - HYUNDAI_BLENDED_ALPHA_RX_CHECKS(0, 100U) - {.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}}}, - }; - ret = BUILD_SAFETY_CFG(alpha_hda1_rx, alpha_hda1_tx); - } - } else -#endif - if (hyundai_blended_stock) { - static const CanMsg blended_tx[] = { - {0x340, 0, 8, .check_relay = true}, - {0x4F1, 0, 4, .check_relay = false}, - {0x485, 0, 8, .check_relay = true}, - {0x364, 0, 8, .check_relay = true}, - }; - static const CanMsg blended_hda2_tx[] = { - {0x50, 0, 16, .check_relay = true}, - {0x4F1, 1, 4, .check_relay = false}, - {0x2A4, 0, 24, .check_relay = true}, - {0x485, 1, 8, .check_relay = false}, - }; - static const CanMsg blended_hda2_aol_tx[] = { - {0x50, 0, 16, .check_relay = true, .disable_static_blocking = true}, - {0x4F1, 1, 4, .check_relay = false}, - {0x2A4, 0, 24, .check_relay = true, .disable_static_blocking = true}, - {0x485, 1, 8, .check_relay = false, .disable_static_blocking = true}, - }; - static const CanMsg blended_aol_tx_msgs[] = { - {0x340, 0, 8, .check_relay = true, .disable_static_blocking = true}, - {0x4F1, 0, 4, .check_relay = false}, - {0x485, 0, 8, .check_relay = true, .disable_static_blocking = true}, - {0x364, 0, 8, .check_relay = true, .disable_static_blocking = true}, - }; - if (hyundai_blended_hda2) { - static RxCheck blended_hda2_rx[] = { - HYUNDAI_BLENDED_COMMON_RX_CHECKS(1, 50U) - {.msg = {{0x2A4, 2, 24, 20U, .max_counter = 255U, .ignore_quality_flag = true}, {0}, {0}}}, - }; - ret = blended_aol_enabled ? BUILD_SAFETY_CFG(blended_hda2_rx, blended_hda2_aol_tx) : - BUILD_SAFETY_CFG(blended_hda2_rx, blended_hda2_tx); - } else { - static RxCheck blended_rx[] = {HYUNDAI_BLENDED_COMMON_RX_CHECKS(0, 100U)}; - ret = blended_aol_enabled ? BUILD_SAFETY_CFG(blended_rx, blended_aol_tx_msgs) : BUILD_SAFETY_CFG(blended_rx, blended_tx); - } - } else if (hyundai_ray_pedal) { - static const CanMsg ray_tx_msgs[] = { - HYUNDAI_COMMON_TX_MSGS(0, true) - {0x200, 0, 6, .check_relay = false}, - }; - static RxCheck ray_rx_checks[] = { + if (hyundai_longitudinal) { + // Use CLU11 (buttons) to manage controls allowed instead of SCC cruise state + static const RxCheck hyundai_long_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) {.msg = {{0x592, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, {0}, {0}}}, HYUNDAI_LDA_BUTTON_ADDR_CHECK @@ -760,7 +681,7 @@ static safety_config hyundai_init(uint16_t param) { } else if (hyundai_longitudinal) { // Use CLU11 (buttons) to manage controls allowed instead of SCC cruise state - static RxCheck hyundai_fcev_long_rx_checks[] = { + static const RxCheck hyundai_fcev_long_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_FCEV_GAS_ADDR_CHECK }; @@ -784,7 +705,7 @@ static safety_config hyundai_init(uint16_t param) { } } } else if (hyundai_camera_scc) { - static RxCheck hyundai_cam_scc_rx_checks[] = { + static const RxCheck hyundai_cam_scc_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_SCC12_ADDR_CHECK(2) }; @@ -796,12 +717,12 @@ static safety_config hyundai_init(uint16_t param) { ret = BUILD_SAFETY_CFG(hyundai_cam_scc_rx_checks, HYUNDAI_CAMERA_SCC_TX_MSGS); } } else { - static RxCheck hyundai_rx_checks[] = { + static const RxCheck hyundai_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_SCC12_ADDR_CHECK(0) }; - static RxCheck hyundai_fcev_rx_checks[] = { + static const RxCheck hyundai_fcev_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_SCC12_ADDR_CHECK(0) HYUNDAI_FCEV_GAS_ADDR_CHECK @@ -908,7 +829,7 @@ static safety_config hyundai_init(uint16_t param) { static safety_config hyundai_legacy_init(uint16_t param) { // older hyundai models have less checks due to missing counters and checksums - static RxCheck hyundai_legacy_rx_checks[] = { + static const RxCheck hyundai_legacy_rx_checks[] = { HYUNDAI_COMMON_RX_CHECKS(true) HYUNDAI_SCC12_ADDR_CHECK(0) }; diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h index 6c7c702af5..f3fcbb3944 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h @@ -1744,7 +1744,7 @@ static safety_config hyundai_canfd_init_validated(uint16_t supplied_param) { #endif if (hyundai_longitudinal) { if (hyundai_canfd_lka_steer_msg) { - static RxCheck hyundai_canfd_lka_steer_msg_long_rx_checks[] = { + static const RxCheck hyundai_canfd_lka_steer_msg_long_rx_checks[] = { HYUNDAI_CANFD_STD_BUTTONS_RX_CHECKS(1) }; @@ -1754,11 +1754,11 @@ static safety_config hyundai_canfd_init_validated(uint16_t supplied_param) { } } else { // Longitudinal checks for LFA steering - static RxCheck hyundai_canfd_long_rx_checks[] = { + static const RxCheck hyundai_canfd_long_rx_checks[] = { HYUNDAI_CANFD_STD_BUTTONS_RX_CHECKS(0) }; - static RxCheck hyundai_canfd_alt_buttons_long_rx_checks[] = { + static const RxCheck hyundai_canfd_alt_buttons_long_rx_checks[] = { HYUNDAI_CANFD_ALT_BUTTONS_RX_CHECKS(0) }; @@ -1790,7 +1790,7 @@ static safety_config hyundai_canfd_init_validated(uint16_t supplied_param) { // *** LKA steering checks *** // E-CAN is on bus 1, SCC messages are sent on cars with ADRV ECU. // Does not use the alt buttons message - static RxCheck hyundai_canfd_lka_steer_msg_rx_checks[] = { + static const RxCheck hyundai_canfd_lka_steer_msg_rx_checks[] = { HYUNDAI_CANFD_STD_BUTTONS_RX_CHECKS(1) HYUNDAI_CANFD_SCC_ADDR_CHECK(1) }; @@ -1819,12 +1819,12 @@ static safety_config hyundai_canfd_init_validated(uint16_t supplied_param) { } } else if (!hyundai_camera_scc) { // Radar sends SCC messages on these cars instead of camera - static RxCheck hyundai_canfd_radar_scc_rx_checks[] = { + static const RxCheck hyundai_canfd_radar_scc_rx_checks[] = { HYUNDAI_CANFD_STD_BUTTONS_RX_CHECKS(0) HYUNDAI_CANFD_SCC_ADDR_CHECK(0) }; - static RxCheck hyundai_canfd_alt_buttons_radar_scc_rx_checks[] = { + static const RxCheck hyundai_canfd_alt_buttons_radar_scc_rx_checks[] = { HYUNDAI_CANFD_ALT_BUTTONS_RX_CHECKS(0) HYUNDAI_CANFD_SCC_ADDR_CHECK(0) }; @@ -1840,12 +1840,12 @@ static safety_config hyundai_canfd_init_validated(uint16_t supplied_param) { // *** LFA steering checks *** // Camera sends SCC messages on LFA steering cars. // Both button messages exist on some platforms, so we ensure we track the correct one using flag - static RxCheck hyundai_canfd_rx_checks[] = { + static const RxCheck hyundai_canfd_rx_checks[] = { HYUNDAI_CANFD_STD_BUTTONS_RX_CHECKS(0) HYUNDAI_CANFD_SCC_ADDR_CHECK(2) }; - static RxCheck hyundai_canfd_alt_buttons_rx_checks[] = { + static const RxCheck hyundai_canfd_alt_buttons_rx_checks[] = { HYUNDAI_CANFD_ALT_BUTTONS_RX_CHECKS(0) HYUNDAI_CANFD_SCC_ADDR_CHECK(2) }; diff --git a/opendbc_repo/opendbc/safety/modes/mazda.h b/opendbc_repo/opendbc/safety/modes/mazda.h index f6af2afe01..4a1dd219d6 100644 --- a/opendbc_repo/opendbc/safety/modes/mazda.h +++ b/opendbc_repo/opendbc/safety/modes/mazda.h @@ -91,7 +91,7 @@ static safety_config mazda_init(uint16_t param) { {MAZDA_LKAS_HUD, 0, 8, .check_relay = true}, }; - static RxCheck mazda_rx_checks[] = { + static const RxCheck mazda_rx_checks[] = { {.msg = {{MAZDA_CRZ_CTRL, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MAZDA_CRZ_BTNS, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MAZDA_STEER_TORQUE, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/mg.h b/opendbc_repo/opendbc/safety/modes/mg.h index 3273c5c945..72c385f5d2 100644 --- a/opendbc_repo/opendbc/safety/modes/mg.h +++ b/opendbc_repo/opendbc/safety/modes/mg.h @@ -124,7 +124,7 @@ static safety_config mg_init(uint16_t param) { static const CanMsg MG_TX_MSGS[] = {{0x1fd, 0, 8, .check_relay = true}}; - static RxCheck mg_rx_checks[] = { + static const RxCheck mg_rx_checks[] = { {.msg = {{0x23c, 0, 8, .frequency = 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // SCS_HSC2_FrP19 (speed) {.msg = {{0xaf, 0, 8, .frequency = 100U, .ignore_checksum = true, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // GW_HSC2_HCU_FrP00 (gas pedal) {.msg = {{0x1ec, 0, 8, .frequency = 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // EPS_HSC2_FrP03 (driver torque) diff --git a/opendbc_repo/opendbc/safety/modes/nissan.h b/opendbc_repo/opendbc/safety/modes/nissan.h index 936ed82c66..00c7e9268d 100644 --- a/opendbc_repo/opendbc/safety/modes/nissan.h +++ b/opendbc_repo/opendbc/safety/modes/nissan.h @@ -105,7 +105,7 @@ static safety_config nissan_init(uint16_t param) { }; // Signals duplicated below due to the fact that these messages can come in on either CAN bus, depending on car model. - static const RxCheck nissan_rx_defaults[] = { + static const RxCheck nissan_rx_checks[] = { {.msg = {{0x185, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // STEER_TORQUE_SENSOR {.msg = {{0x285, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, {0x285, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, // WHEEL_SPEEDS_REAR diff --git a/opendbc_repo/opendbc/safety/modes/psa.h b/opendbc_repo/opendbc/safety/modes/psa.h index 115b162032..382c44c3b1 100644 --- a/opendbc_repo/opendbc/safety/modes/psa.h +++ b/opendbc_repo/opendbc/safety/modes/psa.h @@ -109,7 +109,7 @@ static safety_config psa_init(uint16_t param) { {PSA_LANE_KEEP_ASSIST, PSA_MAIN_BUS, 8, .check_relay = true}, // EPS steering }; - static RxCheck psa_rx_checks[] = { + static const RxCheck psa_rx_checks[] = { {.msg = {{PSA_HS2_DAT_MDD_CMD_452, PSA_ADAS_BUS, 6, 20U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // cruise state {.msg = {{PSA_HS2_DYN_ABR_38D, PSA_MAIN_BUS, 8, 25U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // speed {.msg = {{PSA_STEERING_ALT, PSA_MAIN_BUS, 7, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // steering angle diff --git a/opendbc_repo/opendbc/safety/modes/rivian.h b/opendbc_repo/opendbc/safety/modes/rivian.h index 5ebcb32b2d..e7182f7d5d 100644 --- a/opendbc_repo/opendbc/safety/modes/rivian.h +++ b/opendbc_repo/opendbc/safety/modes/rivian.h @@ -165,7 +165,7 @@ static safety_config rivian_init(uint16_t param) { }; #endif - static const RxCheck rivian_rx_descriptors[] = { + static const RxCheck rivian_rx_checks[] = { {.msg = {{0x208, 0, 8, 50U, .max_counter = 14U}, { 0 }, { 0 }}}, // ESP_Status (speed) {.msg = {{0x150, 0, 7, 50U, .max_counter = 14U}, { 0 }, { 0 }}}, // VDM_PropStatus (gas pedal & 2nd speed) {.msg = {{0x38f, 0, 6, 50U, .max_counter = 14U}, { 0 }, { 0 }}}, // iBESP2 (brakes) diff --git a/opendbc_repo/opendbc/safety/modes/subaru.h b/opendbc_repo/opendbc/safety/modes/subaru.h index 11dffb2595..8c8253735c 100644 --- a/opendbc_repo/opendbc/safety/modes/subaru.h +++ b/opendbc_repo/opendbc/safety/modes/subaru.h @@ -416,38 +416,7 @@ static safety_config subaru_init(uint16_t raw_param) { } safety_config ret; - // Only one Subaru profile is active; share its mutable RX workspace. - static RxCheck subaru_rx_workspace[8]; - int rx_count; - if (subaru_lkas_angle) { - static const RxCheck subaru_gen2_angle_rx_checks[] = { - SUBARU_GEN2_ANGLE_RX_CHECKS() - {.msg = {{MSG_SUBARU_ES_Distance, SUBARU_ALT_BUS, 8, 20U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, - }; - rx_count = sizeof(subaru_gen2_angle_rx_checks) / sizeof(subaru_gen2_angle_rx_checks[0]); - for (int i = 0; i < rx_count; i++) { - subaru_rx_workspace[i] = subaru_gen2_angle_rx_checks[i]; - } - // Only one Subaru angle profile is active. Rebind the complete topology - // on every init; the safety selector resets every selected RX status afterward. - subaru_rx_workspace[0].msg[0].bus = subaru_d_platform ? SUBARU_ALT_BUS : SUBARU_MAIN_BUS; - subaru_rx_workspace[3].msg[0].bus = subaru_forester_angle ? SUBARU_MAIN_BUS : SUBARU_ALT_BUS; - subaru_rx_workspace[4].msg[0].bus = subaru_forester_angle ? SUBARU_MAIN_BUS : SUBARU_ALT_BUS; - subaru_rx_workspace[5].msg[0].bus = subaru_forester_angle ? SUBARU_CAM_BUS : SUBARU_ALT_BUS; - ret = subaru_d_platform ? (stop_start ? BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_OUTBACK_STOP_START_TX_MSGS) : - BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_ASCENT_ANGLE_TX_MSGS_LIST)) : - subaru_forester_angle ? BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_FORESTER_ANGLE_TX_MSGS) : - avh ? (stop_start ? BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_AVH_STOP_START_TX_MSGS) : - BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_AVH_TX_MSGS)) : - stop_start ? BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_STOP_START_TX_MSGS) : - ascent_alert ? BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_ASCENT_ALERT_TX_MSGS) : - subaru_angle_main_bus ? BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_ASCENT_ANGLE_TX_MSGS_LIST) : - BUILD_SAFETY_CFG(subaru_rx_workspace, SUBARU_GEN2_ANGLE_TX_MSGS_LIST); - // Keep the original seven checks on other profiles; only MAIN arming needs ACC health. - if (!subaru_aol_main_arm) { - rx_count--; - } - } else if (subaru_gen2) { + if (subaru_gen2) { static const RxCheck subaru_gen2_rx_checks[] = { SUBARU_COMMON_RX_CHECKS(SUBARU_ALT_BUS) }; diff --git a/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h b/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h index 6011c89685..cc10569f3c 100644 --- a/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h +++ b/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h @@ -83,7 +83,7 @@ static safety_config subaru_preglobal_init(uint16_t param) { }; // TODO: do checksum and counter checks after adding the signals to the outback dbc file - static RxCheck subaru_preglobal_rx_checks[] = { + static const RxCheck subaru_preglobal_rx_checks[] = { {.msg = {{MSG_SUBARU_PG_Throttle, SUBARU_PG_MAIN_BUS, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_SUBARU_PG_Steering_Torque, SUBARU_PG_MAIN_BUS, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_SUBARU_PG_CruiseControl, SUBARU_PG_MAIN_BUS, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/tesla.h b/opendbc_repo/opendbc/safety/modes/tesla.h index 73a32e2d09..7be13cc090 100644 --- a/opendbc_repo/opendbc/safety/modes/tesla.h +++ b/opendbc_repo/opendbc/safety/modes/tesla.h @@ -341,7 +341,7 @@ static safety_config tesla_init(uint16_t param) { tesla_autopark = true; tesla_autopark_prev = false; - static RxCheck tesla_model3_y_rx_checks[] = { + static const RxCheck tesla_model3_y_rx_checks[] = { {.msg = {{0x2b9, 2, 8, 25U, .max_counter = 7U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // DAS_control {.msg = {{0x488, 2, 4, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // DAS_steeringControl {.msg = {{0x257, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // DI_speed (speed in kph) diff --git a/opendbc_repo/opendbc/safety/modes/toyota.h b/opendbc_repo/opendbc/safety/modes/toyota.h index 132e64d073..50af6925e2 100644 --- a/opendbc_repo/opendbc/safety/modes/toyota.h +++ b/opendbc_repo/opendbc/safety/modes/toyota.h @@ -729,116 +729,32 @@ static safety_config toyota_init(uint16_t param) { } if (toyota_secoc) { - static RxCheck toyota_secoc_rx_checks[] = { + static const RxCheck toyota_secoc_rx_checks[] = { TOYOTA_SECOC_RX_CHECKS }; SET_RX_CHECKS(toyota_secoc_rx_checks, ret); + } else if (toyota_lta) { + // Check the quality flag for angle measurement when using LTA, since it's not set on TSS-P cars + static const RxCheck toyota_lta_rx_checks[] = { + TOYOTA_RX_CHECKS(true) + }; + + SET_RX_CHECKS(toyota_lta_rx_checks, ret); } else { - // These profiles use the same four base checks. Share their mutable - // workspace; set_safety_hooks resets every active status on each switch. - static RxCheck toyota_rx_checks[] = { + static const RxCheck toyota_lka_rx_checks[] = { TOYOTA_RX_CHECKS(false) {.msg = {{0x2FF, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = false}, { 0 }, { 0 }}}, {.msg = {{0x365, 0, 7, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{0x1D3, 0, 8, 10U, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{0x201, 0, 6, 50U, .max_counter = 15U, .ignore_quality_flag = false}, { 0 }, { 0 }}}, }; - // LTA alone validates initialized measured angle. Preserve the existing - // alternate-brake selection only on non-LTA profiles. - toyota_rx_checks[1].msg[0].ignore_quality_flag = !toyota_lta; - toyota_rx_checks[3].msg[0].addr = (!toyota_lta && toyota_alt_brake) ? 0x224U : 0x226U; - const bool standalone_pedal = toyota_pedal && !toyota_pedal_composite; - toyota_rx_checks[4].msg[0] = (CanMsgCheck){.addr = toyota_alt_cruise ? 0x365 : (standalone_pedal ? 0x201 : 0x2FF), - .bus = 0U, .len = toyota_alt_cruise ? 7 : (standalone_pedal ? 6 : 8), .frequency = toyota_alt_cruise ? 10U : 50U, - .ignore_checksum = !standalone_pedal, .ignore_counter = !standalone_pedal, - .max_counter = standalone_pedal ? 15U : 0U, .ignore_quality_flag = toyota_alt_cruise}; - if (toyota_legacy_sdsu) { - // Alternate DSU MAIN and smartDSU state are independent mandatory sources. - toyota_rx_checks[4].msg[0] = (CanMsgCheck){.addr = 0x2FF, .bus = 0U, .len = 8, .frequency = 50U, - .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = false}; - } - // Restore the sixth row on every warm switch before specializing the new owner. - toyota_rx_checks[5].msg[0] = (CanMsgCheck){.addr = 0x365, .bus = 0U, .len = 7, .frequency = 10U, - .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}; - if (toyota_legacy_advert_param(base_param) || toyota_camera_2aa_param(base_param) || toyota_prius_advert_param(base_param) || (base_param == 856U)) { - toyota_rx_checks[4].msg[0] = (CanMsgCheck){.addr = 0x262, .bus = 0U, .len = (toyota_camera_2aa_param(base_param) || toyota_prius_advert_param(base_param)) ? 8 : 5, .frequency = 25U, - .ignore_counter = true, .ignore_quality_flag = true}; - if (!toyota_alt_cruise) { - toyota_rx_checks[5].msg[0] = (CanMsgCheck){.addr = 0x1D3, .bus = 0U, .len = 8, .frequency = 10U, - .ignore_counter = true, .ignore_quality_flag = true}; - } - } - if (toyota_prius_sdsu_param(base_param)) { - toyota_rx_checks[5].msg[0] = (CanMsgCheck){.addr = 0x262, .bus = 0U, .len = 8, .frequency = 25U, - .ignore_counter = true, .ignore_quality_flag = true}; - toyota_rx_checks[6].msg[0] = (CanMsgCheck){.addr = 0x1D3, .bus = 0U, .len = 8, .frequency = 10U, - .ignore_counter = true, .ignore_quality_flag = true}; - } - if (toyota_factory_stock) { - toyota_rx_checks[4].msg[0] = (CanMsgCheck){.addr = 0x262, .bus = 0U, .len = toyota_factory_eps5 ? 5 : 8, - .frequency = 25U, .ignore_counter = true, .ignore_quality_flag = true}; - toyota_rx_checks[5].msg[0] = (CanMsgCheck){.addr = toyota_factory_alt_main ? 0x365 : 0x1D3, .bus = 0U, - .len = toyota_factory_alt_main ? 7 : 8, .frequency = 10U, .ignore_checksum = toyota_factory_alt_main, - .ignore_counter = true, .ignore_quality_flag = true}; - } - ret.rx_checks = toyota_rx_checks; - ret.disable_forwarding = false; - if (toyota_factory_stock) { - ret.rx_checks_len = 6; - } else if (toyota_prius_sdsu_param(base_param)) { - ret.rx_checks_len = 7; - } else if ((toyota_legacy_sdsu && toyota_alt_cruise) || toyota_legacy_advert_param(base_param) || toyota_camera_2aa_param(base_param) || toyota_prius_advert_param(base_param) || (base_param == 856U)) { - ret.rx_checks_len = 6; - } else if (standalone_pedal || toyota_alt_cruise || toyota_sdsu_status) { - ret.rx_checks_len = 5; - } else { - ret.rx_checks_len = 4; - } - if (toyota_dsu_bypass) { - toyota_rx_checks[4].msg[0] = (CanMsgCheck){.addr = 0x343, .bus = 2U, .len = 8, .frequency = 33U, - .ignore_counter = true, .ignore_quality_flag = true}; - toyota_rx_checks[5].msg[0] = (CanMsgCheck){.addr = 0x262, .bus = 0U, .len = toyota_bypass_eps5 ? 5 : 8, .frequency = 25U, - .ignore_counter = true, .ignore_quality_flag = true}; - toyota_rx_checks[6].msg[0] = (CanMsgCheck){.addr = toyota_alt_cruise ? 0x365 : 0x1D3, .bus = 0U, - .len = toyota_alt_cruise ? 7 : 8, .frequency = 10U, .ignore_checksum = toyota_alt_cruise, - .ignore_counter = true, .ignore_quality_flag = true}; - ret.rx_checks_len = 7; - } - if ((param == 0xB049U) || (param == 0xB249U)) { - // Keep all parent checks, including smartDSU status, independently required. - toyota_rx_checks[5].msg[0] = (CanMsgCheck){.addr = 0x201, .bus = 0U, .len = 6, .frequency = 50U, - .max_counter = 15U, .ignore_quality_flag = false}; - toyota_rx_checks[6].msg[0] = (CanMsgCheck){.addr = 0x262, .bus = 0U, .len = 5, .frequency = 25U, - .ignore_counter = true, .ignore_quality_flag = true}; - toyota_rx_checks[7].msg[0] = (CanMsgCheck){.addr = 0x1D3, .bus = 0U, .len = 8, .frequency = 10U, - .ignore_counter = true, .ignore_quality_flag = true}; - ret.rx_checks_len = 8; - } else if (toyota_pedal_composite) { - // Append independent physical sources and pedal to the unchanged parent - // catalog. Eight rows cover the largest parent without shrinking buffers. - bool eps_required = false; - bool main_required = false; - for (int i = 0; i < ret.rx_checks_len; i++) { - eps_required |= toyota_rx_checks[i].msg[0].addr == 0x262; - main_required |= toyota_rx_checks[i].msg[0].addr == (toyota_alt_cruise ? 0x365 : 0x1D3); - } - if (!eps_required) { - const bool eps5 = (toyota_dsu_bypass && toyota_bypass_eps5) || toyota_aol_rav4h_filter || - toyota_legacy_sdsu || toyota_legacy_advert(); - toyota_rx_checks[ret.rx_checks_len].msg[0] = (CanMsgCheck){.addr = 0x262, .bus = 0U, - .len = eps5 ? 5 : 8, .frequency = 25U, .ignore_counter = true, .ignore_quality_flag = true}; - ret.rx_checks_len++; - } - if (!main_required) { - toyota_rx_checks[ret.rx_checks_len].msg[0] = (CanMsgCheck){.addr = toyota_alt_cruise ? 0x365 : 0x1D3, - .bus = 0U, .len = toyota_alt_cruise ? 7 : 8, .frequency = 10U, .ignore_checksum = toyota_alt_cruise, - .ignore_counter = true, .ignore_quality_flag = true}; - ret.rx_checks_len++; - } - toyota_rx_checks[ret.rx_checks_len].msg[0] = (CanMsgCheck){.addr = 0x201, .bus = 0U, .len = 6, - .frequency = 50U, .max_counter = 15U, .ignore_quality_flag = false}; - ret.rx_checks_len++; + static const RxCheck toyota_lka_alt_brake_rx_checks[] = { + TOYOTA_ALT_BRAKE_RX_CHECKS(false) + }; + + if (!toyota_alt_brake) { + SET_RX_CHECKS(toyota_lka_rx_checks, ret); } else { } } diff --git a/opendbc_repo/opendbc/safety/modes/volkswagen_meb.h b/opendbc_repo/opendbc/safety/modes/volkswagen_meb.h index dbe8335b90..f6c8a6d5e5 100644 --- a/opendbc_repo/opendbc/safety/modes/volkswagen_meb.h +++ b/opendbc_repo/opendbc/safety/modes/volkswagen_meb.h @@ -138,7 +138,7 @@ static safety_config volkswagen_meb_init(uint16_t param) { safety_config ret; if (volkswagen_meb_alt_crc) { - static RxCheck volkswagen_meb_gen2_rx_checks[] = { + static const RxCheck volkswagen_meb_gen2_rx_checks[] = { VOLKSWAGEN_MEB_COMMON_RX_CHECKS {.msg = {{MSG_Motor_51, 0, 48, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_ESC_51, 0, 64, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, @@ -146,7 +146,7 @@ static safety_config volkswagen_meb_init(uint16_t param) { ret = BUILD_SAFETY_CFG(volkswagen_meb_gen2_rx_checks, VOLKSWAGEN_MEB_TX_MSGS); } else { - static RxCheck volkswagen_meb_rx_checks[] = { + static const RxCheck volkswagen_meb_rx_checks[] = { VOLKSWAGEN_MEB_COMMON_RX_CHECKS {.msg = {{MSG_Motor_51, 0, 32, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_ESC_51, 0, 48, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/volkswagen_mlb.h b/opendbc_repo/opendbc/safety/modes/volkswagen_mlb.h index 25eeca9d10..5e3c0f5d30 100644 --- a/opendbc_repo/opendbc/safety/modes/volkswagen_mlb.h +++ b/opendbc_repo/opendbc/safety/modes/volkswagen_mlb.h @@ -12,7 +12,7 @@ static safety_config volkswagen_mlb_init(uint16_t param) { {MSG_LS_01, 2, 4, .check_relay = false}, }; - static RxCheck volkswagen_mlb_rx_checks[] = { + static const RxCheck volkswagen_mlb_rx_checks[] = { // TODO: implement checksum validation {.msg = {{MSG_ESP_03, 0, 8, 50U, .ignore_checksum = true, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_LH_EPS_03, 0, 8, 100U, .ignore_checksum = true, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/volkswagen_mqb.h b/opendbc_repo/opendbc/safety/modes/volkswagen_mqb.h index ef4a60f9a5..5366acbf52 100644 --- a/opendbc_repo/opendbc/safety/modes/volkswagen_mqb.h +++ b/opendbc_repo/opendbc/safety/modes/volkswagen_mqb.h @@ -24,19 +24,7 @@ static safety_config volkswagen_mqb_init(uint16_t param) { {MSG_ACC_07, 0, 8, .check_relay = true}, }; -#ifdef ALLOW_DEBUG - static const CanMsg VOLKSWAGEN_MQB_AOL_LONG_TX_MSGS[] = { - {MSG_HCA_01, 0, 8, .check_relay = true, .disable_static_blocking = true}, - {MSG_LDW_02, 0, 8, .check_relay = true, .disable_static_blocking = true}, - {MSG_LH_EPS_03, 2, 8, .check_relay = true, .disable_static_blocking = true}, - {MSG_ACC_02, 0, 8, .check_relay = true}, - {MSG_ACC_06, 0, 8, .check_relay = true}, - {MSG_ACC_07, 0, 8, .check_relay = true}, - }; - -#endif - - static RxCheck volkswagen_mqb_rx_checks[] = { + static const RxCheck volkswagen_mqb_rx_checks[] = { {.msg = {{MSG_ESP_19, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_LH_EPS_03, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_ESP_05, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, diff --git a/opendbc_repo/opendbc/safety/modes/volkswagen_pq.h b/opendbc_repo/opendbc/safety/modes/volkswagen_pq.h index ddad3f69b1..cdc1856836 100644 --- a/opendbc_repo/opendbc/safety/modes/volkswagen_pq.h +++ b/opendbc_repo/opendbc/safety/modes/volkswagen_pq.h @@ -62,7 +62,7 @@ static safety_config volkswagen_pq_init(uint16_t param) { {MSG_ACC_GRA_ANZEIGE, 0, 8, .check_relay = true}, }; - static RxCheck volkswagen_pq_rx_checks[] = { + static const RxCheck volkswagen_pq_rx_checks[] = { {.msg = {{MSG_LENKHILFE_3, 0, 6, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_BREMSE_1, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, {.msg = {{MSG_MOTOR_2, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}},