diff --git a/opendbc/can/common.cc b/opendbc/can/common.cc index 312abab530..1b6a114fd0 100644 --- a/opendbc/can/common.cc +++ b/opendbc/can/common.cc @@ -69,6 +69,7 @@ unsigned int chrysler_checksum(uint32_t address, const Signal &sig, const std::v // Static lookup table for fast computation of CRCs uint8_t crc8_lut_8h2f[256]; // CRC8 poly 0x2F, aka 8H2F/AUTOSAR +uint8_t crc8_lut_j1850[256]; // CRC8 poly 0x1D, aka SAE J1850 uint16_t crc16_lut_xmodem[256]; // CRC16 poly 0x1021, aka XMODEM void gen_crc_lookup_table_8(uint8_t poly, uint8_t crc_lut[]) { @@ -107,8 +108,9 @@ void gen_crc_lookup_table_16(uint16_t poly, uint16_t crc_lut[]) { // Initializes CRC lookup tables at module initialization struct CrcInitializer { CrcInitializer() { - gen_crc_lookup_table_8(0x2F, crc8_lut_8h2f); // CRC-8 8H2F/AUTOSAR for Volkswagen - gen_crc_lookup_table_16(0x1021, crc16_lut_xmodem); // CRC-16 XMODEM for HKG CAN FD + gen_crc_lookup_table_8(0x2F, crc8_lut_8h2f); // CRC-8 8H2F/AUTOSAR for Volkswagen + gen_crc_lookup_table_8(0x1D, crc8_lut_j1850); // CRC-8 SAE-J1850 + gen_crc_lookup_table_16(0x1021, crc16_lut_xmodem); // CRC-16 XMODEM for HKG CAN FD } }; @@ -219,3 +221,25 @@ unsigned int hkg_can_fd_checksum(uint32_t address, const Signal &sig, const std: return crc; } + +unsigned int fca_giorgio_checksum(uint32_t address, const Signal &sig, const std::vector &d) { + // CRC is in the last byte, poly is same as SAE J1850 but uses a different init value and final XOR + uint8_t crc = 0x00; + + for (int i = 0; i < d.size() - 1; i++) { + crc ^= d[i]; + crc = crc8_lut_j1850[crc]; + } + + // Final XOR varies for EPS messages, all others use a common value + if (address == 0xDE) { // EPS_1 + return crc ^ 0x10; + } else if (address == 0x106) { // EPS_2 + return crc ^ 0xF6; + } else if (address == 0x122) { // EPS_3 + return crc ^ 0xF1; + } else { + return crc ^ 0xA; + } + +} diff --git a/opendbc/can/common.h b/opendbc/can/common.h index 8b5b8d320d..2991c8b7e9 100644 --- a/opendbc/can/common.h +++ b/opendbc/can/common.h @@ -25,6 +25,7 @@ unsigned int chrysler_checksum(uint32_t address, const Signal &sig, const std::v unsigned int volkswagen_mqb_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int xor_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int hkg_can_fd_checksum(uint32_t address, const Signal &sig, const std::vector &d); +unsigned int fca_giorgio_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int pedal_checksum(uint32_t address, const Signal &sig, const std::vector &d); struct CanFrame { diff --git a/opendbc/can/common.pxd b/opendbc/can/common.pxd index 21e276fa07..3d5e2e5212 100644 --- a/opendbc/can/common.pxd +++ b/opendbc/can/common.pxd @@ -23,6 +23,7 @@ cdef extern from "common_dbc.h": SUBARU_CHECKSUM, CHRYSLER_CHECKSUM HKG_CAN_FD_CHECKSUM, + FCA_GIORGIO_CHECKSUM, cdef struct Signal: string name diff --git a/opendbc/can/common_dbc.h b/opendbc/can/common_dbc.h index 19507ecd4e..b42d3b69ac 100644 --- a/opendbc/can/common_dbc.h +++ b/opendbc/can/common_dbc.h @@ -29,6 +29,7 @@ enum SignalType { SUBARU_CHECKSUM, CHRYSLER_CHECKSUM, HKG_CAN_FD_CHECKSUM, + FCA_GIORGIO_CHECKSUM, }; struct Signal { diff --git a/opendbc/can/dbc.cc b/opendbc/can/dbc.cc index 8e5d65277f..14766affac 100644 --- a/opendbc/can/dbc.cc +++ b/opendbc/can/dbc.cc @@ -65,6 +65,8 @@ ChecksumState* get_checksum(const std::string& dbc_name) { s = new ChecksumState({8, -1, 0, -1, true, SUBARU_CHECKSUM, &subaru_checksum}); } else if (startswith(dbc_name, "chrysler_")) { s = new ChecksumState({8, -1, 7, -1, false, CHRYSLER_CHECKSUM, &chrysler_checksum}); + } else if (startswith(dbc_name, "fca_giorgio")) { + s = new ChecksumState({8, -1, 7, -1, false, FCA_GIORGIO_CHECKSUM, &fca_giorgio_checksum}); } else if (startswith(dbc_name, "comma_body")) { s = new ChecksumState({8, 4, 7, 3, false, PEDAL_CHECKSUM, &pedal_checksum}); } diff --git a/opendbc/can/tests/test_checksums.py b/opendbc/can/tests/test_checksums.py index d031d8e190..b9a0a9ad6c 100644 --- a/opendbc/can/tests/test_checksums.py +++ b/opendbc/can/tests/test_checksums.py @@ -28,6 +28,39 @@ def verify_checksum(self, subtests, dbc_file: str, msg_name: str, msg_addr: int, with subtests.test(counter=expected[counter_field]): assert tested[checksum_field] == expected[checksum_field] + def verify_fca_giorgio_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes]): + """Test modified SAE J1850 CRCs, with special final XOR cases for EPS messages""" + assert len(test_messages) == 3 + self.verify_checksum(subtests, "fca_giorgio", msg_name, msg_addr, test_messages) + + def test_fca_giorgio_eps_1(self, subtests): + self.verify_fca_giorgio_crc(subtests, "EPS_1", 0xDE, [ + b'\x17\x51\x97\xcc\x00\xdf', + b'\x17\x51\x97\xc9\x01\xa3', + b'\x17\x51\x97\xcc\x02\xe5', + ]) + + def test_fca_giorgio_eps_2(self, subtests): + self.verify_fca_giorgio_crc(subtests, "EPS_2", 0x106, [ + b'\x7c\x43\x57\x60\x00\x00\xa1', + b'\x7c\x63\x58\xe0\x00\x01\xd5', + b'\x7c\x63\x58\xe0\x00\x02\xf2', + ]) + + def test_fca_giorgio_eps_3(self, subtests): + self.verify_fca_giorgio_crc(subtests, "EPS_3", 0x122, [ + b'\x7b\x30\x00\xf8', + b'\x7b\x10\x01\x90', + b'\x7b\xf0\x02\x6e', + ]) + + def test_fca_giorgio_abs_2(self, subtests): + self.verify_fca_giorgio_crc(subtests, "ABS_2", 0xFE, [ + b'\x7e\x38\x00\x7d\x10\x31\x80\x32', + b'\x7e\x38\x00\x7d\x10\x31\x81\x2f', + b'\x7e\x38\x00\x7d\x20\x31\x82\x20', + ]) + def test_honda_checksum(self): """Test checksums for Honda standard and extended CAN ids""" # TODO: refactor to use self.verify_checksum() diff --git a/opendbc/dbc/fca_giorgio.dbc b/opendbc/dbc/fca_giorgio.dbc new file mode 100644 index 0000000000..f3e22cf417 --- /dev/null +++ b/opendbc/dbc/fca_giorgio.dbc @@ -0,0 +1,243 @@ +BO_ 171 NEW_MSG_AB: 8 XXX + SG_ NEW_SIGNAL_5 : 3|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_6 : 21|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_1 : 23|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 222 EPS_1: 6 EPS + SG_ STEERING_ANGLE : 5|14@0+ (0.1,-716.8) [0|16383] "deg" XXX + SG_ STEERING_RATE : 19|12@0+ (0.5,-1000) [0|4095] "deg/s" XXX + SG_ UNKNOWN_1 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 228 NEW_MSG_E4: 6 XXX + SG_ NEW_SIGNAL_1 : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 238 ABS_1: 8 ABS + SG_ WHEEL_SPEED_FL : 7|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ WHEEL_SPEED_FR : 10|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ WHEEL_SPEED_RL : 29|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ WHEEL_SPEED_RR : 32|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 241 NEW_MSG_F1: 8 XXX + SG_ MAYBE_VOLTAGE : 18|10@0+ (0.02,0) [0|1023] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 249 NEW_MSG_F9: 4 XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 250 ABS_3: 8 ABS + SG_ BRAKE_PRESSURE_THRESHOLD : 2|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PEDAL_SWITCH : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 9|2@0+ (1,0) [0|3] "" XXX + SG_ XCOUNTER : 38|4@0+ (1,0) [0|15] "" XXX + SG_ XCHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 252 ENGINE_1: 8 ENGINE + SG_ ENGINE_RPM : 7|14@0+ (1,0) [0|255] "rev/min" XXX + SG_ ACCEL_PEDAL : 20|8@0+ (0.4,0) [0|255] "percent" XXX + SG_ REVERSE : 26|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 46|2@1+ (1,0) [0|3] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 254 ABS_2: 8 ABS + SG_ LONG_ACCEL : 7|12@0+ (0.01,-20.48) [0|4095] "m/s2" XXX + SG_ LATERAL_ACCEL : 11|12@0+ (0.01,-20.48) [0|4095] "m/s2" XXX + SG_ YAW_RATE : 31|12@0+ (-0.0014,2.86) [0|4095] "rad/s" XXX + SG_ NEW_SIGNAL_1 : 47|9@0+ (1,0) [0|511] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 257 ABS_6: 8 ABS + SG_ MAYBE_ACC_BRAKE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ VEHICLE_SPEED : 15|11@0+ (0.017,0) [0|2047] "" XXX + SG_ BRAKE_PRESSURE_1 : 20|11@0+ (1,0) [0|2047] "" XXX + SG_ BRAKE_PRESSURE_2 : 43|12@0+ (1,0) [0|4095] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 262 EPS_2: 7 EPS + SG_ UNKNOWN_TORQUE : 7|12@0+ (1,-2000) [0|4095] "" XXX + SG_ UNKNOWN_1 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_STATUS : 9|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_TORQUE : 23|11@0+ (1,-1024) [0|2047] "" XXX + SG_ UNKNOWN_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_STATUS : 38|2@0+ (1,0) [0|3] "" XXX + SG_ LKA_FAULT : 39|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 263 ABS_4: 8 ABS + SG_ BRAKE_PRESSURE : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 265 NEW_MSG_109: 8 XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 270 ABS_7: 7 XXX + SG_ LONG_ACCEL_RAW : 7|12@0+ (0.01,-20.48) [0|4095] "" XXX + SG_ LATERAL_ACCEL_RAW : 11|12@0+ (0.01,-20.48) [0|4095] "" XXX + SG_ YAW_RATE_RAW : 31|12@0+ (-0.0014,2.86) [0|4095] "" XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 278 ABS_5: 8 ABS + SG_ WHEEL_IMPULSE_FL : 7|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_IMPULSE_FR : 15|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_IMPULSE_RL : 23|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_IMPULSE_RR : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ACTIVE_FL : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_FR : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_RL : 34|1@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_RR : 35|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_1 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_1 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_2 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_2 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 280 NEW_MSG_118: 6 XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 282 NEW_MSG_11A: 8 XXX + SG_ NEW_SIGNAL_1 : 7|11@0+ (1,-1000) [0|2047] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 284 NEW_MSG_11C: 8 XXX + SG_ NEW_SIGNAL_1 : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_2 : 11|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_3 : 28|13@0+ (1,0) [0|8191] "" XXX + SG_ NEW_SIGNAL_4 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ VEHICLE_SPEED : 47|12@0+ (0.017,0) [0|4095] "m/s" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 288 NEW_MSG_120: 6 XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 290 EPS_3: 4 EPS + SG_ EPS_TORQUE : 7|12@0+ (1,-2048) [0|4095] "" XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 501 NEW_MSG_1F5: 5 XXX + SG_ NEW_SIGNAL_2 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 27|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 502 LKA_COMMAND: 8 CAMERA + SG_ LKA_TORQUE : 7|11@0+ (1,-1024) [0|2047] "" XXX + SG_ HAPTIC_WARN_1 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_ACTIVE : 11|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ HAPTIC_WARN_2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 508 NEW_MSG_1FC: 8 XXX + SG_ NEW_SIGNAL_1 : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 601 NEW_MSG_259: 8 XXX + SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 762 NEW_MSG_2FA: 3 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 766 CAM_UNKNOWN_1: 4 CAMERA + +BO_ 900 NEW_MSG_384: 8 XXX + SG_ NEW_SIGNAL_1 : 19|3@0+ (1,0) [0|7] "" XXX + +BO_ 1040 NEW_MSG_410: 8 XXX + SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1046 NEW_MSG_416: 8 XXX + SG_ MUX M : 1|2@0+ (1,0) [0|3] "" XXX + SG_ UNKNOWN_M0_1 m0 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_2 m0 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_3 m0 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_4 m0 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_5 m0 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_6 m0 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_7 m0 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_1 m1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_2 m1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_3 m1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_4 m1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_5 m1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_6 m1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_7 m1 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_1 m2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_2 m2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_3 m2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_4 m2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_5 m2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_6 m2 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_7 m2 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1194 CAM_UNKNOWN_2: 8 CAMERA + +BO_ 1198 LKA_HUD_1: 8 CAMERA + SG_ NEW_SIGNAL_1 : 4|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_3 : 12|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 38|3@0+ (1,0) [0|7] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1351 LKA_HUD_2: 8 CAMERA + SG_ NEW_SIGNAL_1 : 51|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 1442 ACC_1: 8 RADAR + SG_ HUD_SPEED : 7|8@0+ (1,0) [0|255] "km/h" XXX + SG_ TARGET_SPEED : 15|8@0+ (0.433,0) [0|255] "m/s" XXX + SG_ NEW_SIGNAL_3 : 17|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_4 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_STATUS : 22|2@0+ (1,0) [0|3] "" XXX + SG_ MAYBE_TJA : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1458 CAM_UNKNOWN_5: 4 CAMERA + SG_ NEW_SIGNAL_1 : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 1854 BCM_1: 4 BCM + SG_ RIGHT_TURN_STALK : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_TURN_STALK : 17|1@0+ (1,0) [0|1] "" XXX + +BO_ 1865 NEW_MSG_749: 8 XXX + SG_ NEW_SIGNAL_1 : 23|2@0+ (1,0) [0|3] "" XXX + +BO_ 506855454 CAM_UNKNOWN_6: 1 CAMERA + +CM_ SG_ 254 LONG_ACCEL "scale TBD"; +CM_ SG_ 254 LATERAL_ACCEL "scale TBD"; +CM_ SG_ 254 YAW_RATE "scale estimated"; +CM_ SG_ 257 MAYBE_ACC_BRAKE "may correlate with ACC-actuated braking"; +CM_ SG_ 278 FORWARD_1 "probably per-axle"; +CM_ SG_ 278 REVERSE_1 "probably per-axle"; +CM_ SG_ 278 FORWARD_2 "probably per-axle"; +CM_ SG_ 278 REVERSE_2 "probably per-axle"; +CM_ SG_ 282 NEW_SIGNAL_1 "smoothed yaw rate with low speed cutoff, maybe active forward lighting target angle"; +CM_ SG_ 284 VEHICLE_SPEED "scale estimated"; +CM_ SG_ 502 HAPTIC_WARN_1 "correlates with steering wheel haptic"; +CM_ SG_ 502 HAPTIC_WARN_2 "correlates with steering wheel haptic"; +CM_ BO_ 1198 "Definite LKA activity, probably contains lane-line recognition and lane departure signals, indicator of LKA vs TJA, perhaps indicator of active assist in map-permitted areas"; +VAL_ 262 LKA_STATUS 0 "standby" 1 "lka_active";