import copy from opendbc.can.parser import CANParser from opendbc.can.packer import CANPacker class TestCanChecksums: def verify_checksum(self, subtests, dbc_file: str, msg_name: str, msg_addr: int, test_messages: list[bytes], checksum_field: str = 'CHECKSUM', counter_field = 'COUNTER'): """ Verify that opendbc calculates payload CRCs/checksums matching those received in known-good sample messages Depends on all non-zero bits in the sample message having a corresponding DBC signal, add UNKNOWN signals if needed """ parser = CANParser(dbc_file, [(msg_name, 0)], 0) packer = CANPacker(dbc_file) for data in test_messages: expected_msg = (msg_addr, data, 0) parser.update_strings([0, [expected_msg]]) expected = copy.deepcopy(parser.vl[msg_name]) modified = copy.deepcopy(expected) modified.pop(checksum_field, None) modified_msg = packer.make_can_msg(msg_name, 0, modified) parser.update_strings([0, [modified_msg]]) tested = parser.vl[msg_name] with subtests.test(counter=expected[counter_field]): assert tested[checksum_field] == expected[checksum_field] def verify_fca_giorgio_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes]): """Test modified SAE J1850 CRCs, with special final XOR cases for EPS messages""" assert len(test_messages) == 3 self.verify_checksum(subtests, "fca_giorgio", msg_name, msg_addr, test_messages) def test_fca_giorgio_eps_1(self, subtests): self.verify_fca_giorgio_crc(subtests, "EPS_1", 0xDE, [ b'\x17\x51\x97\xcc\x00\xdf', b'\x17\x51\x97\xc9\x01\xa3', b'\x17\x51\x97\xcc\x02\xe5', ]) def test_fca_giorgio_eps_2(self, subtests): self.verify_fca_giorgio_crc(subtests, "EPS_2", 0x106, [ b'\x7c\x43\x57\x60\x00\x00\xa1', b'\x7c\x63\x58\xe0\x00\x01\xd5', b'\x7c\x63\x58\xe0\x00\x02\xf2', ]) def test_fca_giorgio_eps_3(self, subtests): self.verify_fca_giorgio_crc(subtests, "EPS_3", 0x122, [ b'\x7b\x30\x00\xf8', b'\x7b\x10\x01\x90', b'\x7b\xf0\x02\x6e', ]) def test_fca_giorgio_abs_2(self, subtests): self.verify_fca_giorgio_crc(subtests, "ABS_2", 0xFE, [ b'\x7e\x38\x00\x7d\x10\x31\x80\x32', b'\x7e\x38\x00\x7d\x10\x31\x81\x2f', b'\x7e\x38\x00\x7d\x20\x31\x82\x20', ]) def test_honda_checksum(self): """Test checksums for Honda standard and extended CAN ids""" # TODO: refactor to use self.verify_checksum() dbc_file = "honda_accord_2018_can_generated" msgs = [("LKAS_HUD", 0), ("LKAS_HUD_A", 0)] parser = CANParser(dbc_file, msgs, 0) packer = CANPacker(dbc_file) values = { 'SET_ME_X41': 0x41, 'STEERING_REQUIRED': 1, 'SOLID_LANES': 1, 'BEEP': 0, } # known correct checksums according to the above values checksum_std = [11, 10, 9, 8] checksum_ext = [4, 3, 2, 1] for std, ext in zip(checksum_std, checksum_ext, strict=True): msgs = [ packer.make_can_msg("LKAS_HUD", 0, values), packer.make_can_msg("LKAS_HUD_A", 0, values), ] parser.update_strings([0, msgs]) assert parser.vl['LKAS_HUD']['CHECKSUM'] == std assert parser.vl['LKAS_HUD_A']['CHECKSUM'] == ext def verify_volkswagen_mqb_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes], counter_field: str = 'COUNTER'): """Test AUTOSAR E2E Profile 2 CRCs""" assert len(test_messages) == 16 # All counter values must be tested self.verify_checksum(subtests, "vw_mqb", msg_name, msg_addr, test_messages, counter_field=counter_field) def test_volkswagen_mqb_crc_lwi_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "LWI_01", 0x86, [ b'\x6b\x00\xbd\x00\x00\x00\x00\x00', b'\xee\x01\x0a\x00\x00\x00\x00\x00', b'\xd8\x02\xa9\x00\x00\x00\x00\x00', b'\x03\x03\xbe\xa2\x12\x00\x00\x00', b'\x7b\x04\x31\x20\x03\x00\x00\x00', b'\x8b\x05\xe2\x85\x09\x00\x00\x00', b'\x63\x06\x13\x21\x00\x00\x00\x00', b'\x66\x07\x05\x00\x00\x00\x00\x00', b'\x49\x08\x0d\x00\x00\x00\x00\x00', b'\x5f\x09\x7e\x60\x01\x00\x00\x00', b'\xaf\x0a\x72\x20\x00\x00\x00\x00', b'\x59\x0b\x1b\x00\x00\x00\x00\x00', b'\xa8\x0c\x06\x00\x00\x00\x00\x00', b'\xbc\x0d\x72\x20\x00\x00\x00\x00', b'\xf9\x0e\x0f\x00\x00\x00\x00\x00', b'\x60\x0f\x62\xc0\x00\x00\x00\x00', ]) def test_volkswagen_mqb_crc_airbag_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "Airbag_01", 0x40, [ b'\xaf\x00\x00\x80\xc0\x00\x20\x3e', b'\x54\x01\x00\x80\xc0\x00\x20\x1a', b'\x54\x02\x00\x80\xc0\x00\x60\x00', b'\x31\x03\x00\x80\xc0\x00\x60\xf2', b'\xe0\x04\x00\x80\xc0\x00\x60\xcc', b'\xb3\x05\x00\x80\xc0\x00\x40\xde', b'\xa4\x06\x00\x80\xc0\x00\x40\x18', b'\x94\x07\x00\x80\xc0\x00\x20\x38', b'\x2d\x08\x00\x80\xc0\x00\x60\xae', b'\xc2\x09\x00\x80\xc0\x00\x00\x1c', b'\x1f\x0a\x00\x80\xc0\x00\x60\x2c', b'\x7f\x0b\x00\x80\xc0\x00\x00\x00', b'\x03\x0c\x00\x80\xc0\x00\x40\xd6', b'\x56\x0d\x00\x80\xc0\x00\x20\x50', b'\x4a\x0e\x00\x80\xc0\x00\x20\xf2', b'\xe5\x0f\x00\x80\xc0\x00\x40\xf6', ]) def test_volkswagen_mqb_crc_lh_eps_03(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "LH_EPS_03", 0x9F, [ b'\x11\x30\x2e\x00\x05\x1c\x80\x30', b'\x5b\x31\x8e\x03\x05\x53\x00\x30', b'\xcb\x32\xd3\x06\x05\x73\x00\x30', b'\xf2\x33\x28\x00\x05\x26\x00\x30', b'\x0b\x34\x44\x00\x05\x5b\x80\x30', b'\xed\x35\x80\x00\x03\x34\x00\x30', b'\xf0\x36\x88\x00\x05\x3d\x80\x30', b'\x9e\x37\x44\x03\x05\x41\x00\x30', b'\x68\x38\x06\x01\x05\x18\x80\x30', b'\x87\x39\x51\x00\x05\x11\x80\x30', b'\x8c\x3a\x29\x00\x05\xac\x00\x30', b'\x08\x3b\xbd\x00\x05\x8e\x00\x30', b'\xd4\x3c\x19\x00\x05\x05\x80\x30', b'\x29\x3d\x54\x00\x05\x5b\x00\x30', b'\xa1\x3e\x49\x01\x03\x04\x80\x30', b'\xe2\x3f\x05\x00\x05\x0a\x00\x30', ]) def test_volkswagen_mqb_crc_getriebe_11(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "Getriebe_11", 0xAD, [ b'\xf8\xe0\xbf\xff\x5f\x20\x20\x20', b'\xb0\xe1\xbf\xff\xc6\x98\x21\x80', b'\xd2\xe2\xbf\xff\x5f\x20\x20\x20', b'\x00\xe3\xbf\xff\xaa\x20\x20\x10', b'\xf1\xe4\xbf\xff\x5f\x20\x20\x20', b'\xc4\xe5\xbf\xff\x5f\x20\x20\x20', b'\xda\xe6\xbf\xff\x5f\x20\x20\x20', b'\x85\xe7\xbf\xff\x5f\x20\x20\x20', b'\x12\xe8\xbf\xff\x5f\x20\x20\x20', b'\x45\xe9\xbf\xff\xaa\x20\x20\x10', b'\x03\xea\xbf\xff\xcc\x20\x20\x10', b'\xfc\xeb\xbf\xff\x5f\x20\x21\x20', b'\xfe\xec\xbf\xff\xad\x20\x20\x10', b'\xbd\xed\xbf\xff\xaa\x20\x20\x10', b'\x67\xee\xbf\xff\xaa\x20\x20\x10', b'\x36\xef\xbf\xff\xaa\x20\x20\x10', ], counter_field="COUNTER_DISABLED") # see opendbc#1235 def test_volkswagen_mqb_crc_esp_21(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ESP_21", 0xFD, [ b'\x66\xd0\x1f\x80\x45\x05\x00\x00', b'\x87\xd1\x1f\x80\x52\x05\x00\x00', b'\xcd\xd2\x1f\x80\x50\x06\x00\x00', b'\xfd\xd3\x1f\x80\x35\x02\x00\x00', b'\xfa\xd4\x1f\x80\x22\x05\x00\x00', b'\xfd\xd5\x1f\x80\x84\x04\x00\x00', b'\x2e\xd6\x1f\x80\xf0\x03\x00\x00', b'\x9f\xd7\x1f\x80\x00\x00\x00\x00', b'\x1e\xd8\x1f\x80\xb3\x03\x00\x00', b'\x61\xd9\x1f\x80\x6d\x05\x00\x00', b'\x44\xda\x1f\x80\x47\x02\x00\x00', b'\x86\xdb\x1f\x80\x3a\x02\x00\x00', b'\x39\xdc\x1f\x80\xcb\x01\x00\x00', b'\x19\xdd\x1f\x80\x00\x00\x00\x00', b'\x8c\xde\x1f\x80\xba\x04\x00\x00', b'\xfb\xdf\x1f\x80\x46\x00\x00\x00', ]) def test_volkswagen_mqb_crc_esp_02(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ESP_02", 0x101, [ b'\xf2\x00\x7e\xff\xa1\x2a\x40\x00', b'\xd3\x01\x7d\x00\xa2\x0c\x02\x00', b'\x03\x02\x7a\x06\xa2\x49\x42\x00', b'\xfd\x03\x70\xfb\xa1\xde\x00\x00', b'\x8e\x04\x7b\xf7\xa1\xd2\x01\x00', b'\x0f\x05\x7d\xfd\xa1\x31\x40\x00', b'\xb6\x06\x7d\x01\xa2\x0a\x40\x00', b'\xe8\x07\x7e\xfd\xa1\x12\x40\x00', b'\x74\x08\x7a\x01\xa2\x40\x01\x00', b'\xe3\x09\x81\x00\xa2\xb5\x01\x00', b'\xab\x0a\x74\x09\xa2\x9f\x42\x00', b'\xf3\x0b\x80\x12\xa2\x94\x00\x00', b'\x88\x0c\x7f\x07\xa2\x46\x00\x00', b'\x6f\x0d\x7f\xff\xa1\x53\x40\x00', b'\x38\x0e\x73\xd6\xa1\x6a\x40\x00', b'\x49\x0f\x85\x12\xa2\xf6\x01\x00', ]) def test_volkswagen_mqb_crc_esp_05(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ESP_05", 0x106, [ b'\x90\x80\x64\x00\x00\x00\xe7\x10', b'\xf4\x81\x64\x00\x00\x00\xe7\x10', b'\x90\x82\x63\x00\x00\x00\xe8\x10', b'\xa0\x83\x63\x00\x00\x00\xe6\x10', b'\xe7\x84\x63\x00\x00\x00\xe8\x10', b'\x2e\x85\x78\x04\x00\x00\xea\x30', b'\x7b\x86\x63\x00\x00\x00\xe6\x10', b'\x71\x87\x79\x04\x00\x00\xd0\x30', b'\x50\x88\x79\x04\x00\x00\xea\x30', b'\x81\x89\x64\x00\x00\x00\xe1\x10', b'\x6a\x8a\x68\x00\x00\x04\xd0\x10', b'\x17\x8b\x6a\x04\x00\x00\xe6\x10', b'\xc7\x8c\x63\x00\x00\x00\xd1\x10', b'\x53\x8d\x64\x04\x00\x00\xe2\x10', b'\x24\x8e\x63\x00\x00\x00\xe7\x10', b'\x3f\x8f\x82\x04\x00\x00\xe6\x30', ]) def test_volkswagen_mqb_crc_esp_10(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ESP_10", 0x116, [ b'\x2d\x00\xd5\x98\x9f\x26\x25\x0f', b'\x24\x01\x60\x63\x2c\x5e\x3b\x0f', b'\x08\x02\xb2\x2f\xee\x9a\x29\x0f', b'\x7c\x03\x17\x07\x1d\xe5\x8c\x0f', b'\xaa\x04\xd6\xe3\xeb\x98\xe8\x0f', b'\x4e\x05\xbb\xd9\x65\x43\xca\x0f', b'\x59\x06\x78\xbd\x25\xc6\xf2\xff', b'\xaf\x07\x42\x85\x53\xbe\xbe\x0f', b'\x2a\x08\xa6\xcd\x95\x8c\x12\x0f', b'\xce\x09\x6e\x17\x6d\x1b\x2f\x0f', b'\x60\x0a\xd3\xe6\x3a\x8d\xf0\x0f', b'\xc5\x0b\xfc\x69\x57\x50\x21\x0f', b'\x70\x0c\xde\xf3\x9d\xe9\x6b\xff', b'\x62\x0d\xc4\x1a\xdb\x61\x7a\x0f', b'\x76\x0e\x79\x69\xe3\x32\x67\x0f', b'\x15\x0f\x51\x59\x56\x35\xb1\x0f', ]) def test_volkswagen_mqb_crc_acc_10(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ACC_10", 0x117, [ b'\x9b\x00\x00\x40\x68\x00\x00\xff', b'\xff\x01\x00\x40\x68\x00\x00\xff', b'\x53\x02\x00\x40\x68\x00\x00\xff', b'\x37\x03\x00\x40\x68\x00\x00\xff', b'\x24\x04\x00\x40\x68\x00\x00\xff', b'\x40\x05\x00\x40\x68\x00\x00\xff', b'\xec\x06\x00\x40\x68\x00\x00\xff', b'\x88\x07\x00\x40\x68\x00\x00\xff', b'\xca\x08\x00\x40\x68\x00\x00\xff', b'\xae\x09\x00\x40\x68\x00\x00\xff', b'\x02\x0a\x00\x40\x68\x00\x00\xff', b'\x66\x0b\x00\x40\x68\x00\x00\xff', b'\x75\x0c\x00\x40\x68\x00\x00\xff', b'\x11\x0d\x00\x40\x68\x00\x00\xff', b'\xbd\x0e\x00\x40\x68\x00\x00\xff', b'\xd9\x0f\x00\x40\x68\x00\x00\xff', ]) def test_volkswagen_mqb_crc_tsk_06(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "TSK_06", 0x120, [ b'\xc1\x00\x00\x02\x00\x08\xff\x21', b'\x34\x01\x00\x02\x00\x08\xff\x21', b'\xcc\x02\x00\x02\x00\x08\xff\x21', b'\x1e\x03\x00\x02\x00\x08\xff\x21', b'\x48\x04\x00\x02\x00\x08\xff\x21', b'\x4a\x05\x00\x02\x00\x08\xff\x21', b'\xa5\x06\x00\x02\x00\x08\xff\x21', b'\xa7\x07\x00\x02\x00\x08\xff\x21', b'\xfe\x08\x00\x02\x00\x08\xff\x21', b'\xa8\x09\x00\x02\x00\x08\xff\x21', b'\x73\x0a\x00\x02\x00\x08\xff\x21', b'\xdf\x0b\x00\x02\x00\x08\xff\x21', b'\x05\x0c\x00\x02\x00\x08\xff\x21', b'\xb5\x0d\x00\x02\x00\x08\xff\x21', b'\xde\x0e\x00\x02\x00\x08\xff\x21', b'\x0b\x0f\x00\x02\x00\x08\xff\x21', ]) def test_volkswagen_mqb_crc_motor_20(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "Motor_20", 0x121, [ b'\xb9\x00\x00\xc0\x39\x46\x7e\xfe', b'\x85\x31\x20\x00\x1a\x46\x7e\xfe', b'\xc7\x12\x00\x40\x1a\x46\x7e\xfe', b'\x53\x93\x00\x00\x19\x46\x7e\xfe', b'\xa4\x34\x00\x80\x1a\x46\x7e\xfe', b'\x0e\x55\x20\x60\x18\x46\x7e\xfe', b'\x3f\x06\x00\xc0\x37\x4c\x7e\xfe', b'\x0c\x07\x00\x40\x39\x46\x7e\xfe', b'\x2a\x08\x00\x00\x3a\x46\x7e\xfe', b'\x7f\x49\x20\x80\x1a\x46\x7e\xfe', b'\x2f\x0a\x00\xc0\x39\x46\x7e\xfe', b'\x70\xbb\x00\x00\x17\x46\x7e\xfe', b'\x06\x0c\x00\x00\x39\x46\x7e\xfe', b'\x4b\x9d\x20\xe0\x16\x4c\x7e\xfe', b'\x73\xfe\x00\x40\x16\x46\x7e\xfe', b'\xaf\x0f\x20\x80\x39\x4c\x7e\xfe', ]) def test_volkswagen_mqb_crc_acc_06(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ACC_06", 0x122, [ b'\x14\x80\x00\xfe\x07\x00\x00\x18', b'\x9f\x81\x00\xfe\x07\x00\x00\x18', b'\x0a\x82\x00\xfe\x07\x00\x00\x28', b'\x40\x83\x00\xfe\x07\x00\x00\x18', b'\x2d\x84\x00\xfe\x07\x00\x00\x28', b'\xdb\x85\x00\xfe\x07\x00\x00\x18', b'\x4d\x86\x00\xfe\x07\x00\x00\x28', b'\x35\x87\x00\xfe\x07\x00\x00\x18', b'\x23\x88\x00\xfe\x07\x00\x00\x28', b'\x4a\x89\x00\xfe\x07\x00\x00\x28', b'\xe1\x8a\x00\xfe\x07\x00\x00\x28', b'\x30\x8b\x00\xfe\x07\x00\x00\x28', b'\x60\x8c\x00\xfe\x07\x00\x00\x28', b'\x0d\x8d\x00\xfe\x07\x00\x00\x18', b'\x8c\x8e\x00\xfe\x07\x00\x00\x18', b'\x6f\x8f\x00\xfe\x07\x00\x00\x28', ]) def test_volkswagen_mqb_crc_hca_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "HCA_01", 0x126, [ b'\x00\x30\x0d\xc0\x05\xfe\x07\x00', b'\x3e\x31\x54\xc0\x05\xfe\x07\x00', b'\xa7\x32\xbb\x40\x05\xfe\x07\x00', b'\x96\x33\x29\xc0\x05\xfe\x07\x00', b'\x5f\x34\x00\x00\x03\xfe\x07\x00', b'\x3b\x35\xae\x40\x05\xfe\x07\x00', b'\xc7\x36\x7a\x40\x05\xfe\x07\x00', b'\x6f\x37\x76\x40\x05\xfe\x07\x00', b'\xb1\x38\x00\x00\x03\xfe\x07\x00', b'\xd5\x39\x00\x00\x03\xfe\x07\x00', b'\xba\x3a\x69\xc0\x05\xfe\x07\x00', b'\x65\x3b\x10\x40\x05\xfe\x07\x00', b'\x49\x3c\x72\xc0\x05\xfe\x07\x00', b'\xc6\x3d\xdf\x40\x05\xfe\x07\x00', b'\x1d\x3e\x2c\xc1\x05\xfe\x07\x00', b'\x9b\x3f\x20\x40\x05\xfe\x07\x00', ]) def test_volkswagen_mqb_crc_gra_acc_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "GRA_ACC_01", 0x12B, [ b'\x86\x40\x80\x2a\x00\x00\x00\x00', b'\xf4\x41\x80\x2a\x00\x00\x00\x00', b'\x50\x42\x80\x2a\x00\x00\x00\x00', b'\x08\x43\x80\x2a\x00\x00\x00\x00', b'\x88\x44\x80\x2a\x00\x00\x00\x00', b'\x2d\x45\x80\x2a\x00\x00\x00\x00', b'\x34\x46\x80\x2a\x00\x00\x00\x00', b'\x11\x47\x80\x2a\x00\x00\x00\x00', b'\xc4\x48\x80\x2a\x00\x00\x00\x00', b'\xcc\x49\x80\x2a\x00\x00\x00\x00', b'\xdc\x4a\x80\x2a\x00\x00\x00\x00', b'\x79\x4b\x80\x2a\x00\x00\x00\x00', b'\x3c\x4c\x80\x2a\x00\x00\x00\x00', b'\x68\x4d\x80\x2a\x00\x00\x00\x00', b'\x27\x4e\x80\x2a\x00\x00\x00\x00', b'\x0d\x4f\x80\x2a\x00\x00\x00\x00', ]) def test_volkswagen_mqb_crc_acc_07(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ACC_07", 0x12E, [ b'\xac\xe0\x7f\x00\xfe\x00\xc0\xff', b'\xa2\xe1\x7f\x00\xfe\x00\xc0\xff', b'\x6b\xe2\x7f\x00\xfe\x00\xc0\xff', b'\xf2\xe3\x7f\x00\xfe\x00\xc0\xff', b'\xd5\xe4\x7f\x00\xfe\x00\xc0\xff', b'\x35\xe5\x7f\x00\xfe\x00\xc0\xff', b'\x7f\xe6\x7f\x00\xfe\x00\xc0\xff', b'\x6c\xe7\x7f\x00\xfe\x00\xc0\xff', b'\x05\xe8\x7f\x00\xfe\x00\xc0\xff', b'\x79\xe9\x7f\x00\xfe\x00\xc0\xff', b'\x25\xea\x7f\x00\xfe\x00\xc0\xff', b'\xd1\xeb\x7f\x00\xfe\x00\xc0\xff', b'\x72\xec\x7f\x00\xfe\x00\xc0\xff', b'\x58\xed\x7f\x00\xfe\x00\xc0\xff', b'\x82\xee\x7f\x00\xfe\x00\xc0\xff', b'\x85\xef\x7f\x00\xfe\x00\xc0\xff', ]) def test_volkswagen_mqb_crc_motor_ev_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "Motor_EV_01", 0x187, [ b'\x70\x80\x15\x00\x00\x00\x00\xF0', b'\x07\x81\x15\x00\x00\x00\x00\xF0', b'\x7A\x82\x15\x00\x00\x00\x00\xF0', b'\x26\x83\x15\x00\x00\x00\x00\xF0', b'\xBE\x84\x15\x00\x00\x00\x00\xF0', b'\x5A\x85\x15\x00\x00\x00\x00\xF0', b'\xFC\x86\x15\x00\x00\x00\x00\xF0', b'\x9E\x87\x15\x00\x00\x00\x00\xF0', b'\xAF\x88\x15\x00\x00\x00\x00\xF0', b'\x35\x89\x15\x00\x00\x00\x00\xF0', b'\xC5\x8A\x15\x00\x00\x00\x00\xF0', b'\x11\x8B\x15\x00\x00\x00\x00\xF0', b'\xD0\x8C\x15\x00\x00\x00\x00\xF0', b'\xE8\x8D\x15\x00\x00\x00\x00\xF0', b'\xF5\x8E\x15\x00\x00\x00\x00\xF0', b'\x00\x8F\x15\x00\x00\x00\x00\xF0', ]) def test_volkswagen_mqb_crc_esp_33(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ESP_33", 0x1AB, [ b'\x64\x00\x80\x02\x00\x00\x00\x00', b'\x19\x01\x00\x00\x00\x00\x00\x00', b'\xfc\x02\x00\x10\x01\x00\x00\x00', b'\x8b\x03\x80\x02\x00\x00\x00\x00', b'\xa4\x04\x00\x10\x01\x00\x00\x00', b'\x97\x05\x00\x02\x00\x00\x01\x00', b'\xd5\x06\x80\x02\x00\x00\x01\x00', b'\xa0\x07\x80\x02\x00\x00\x01\x00', b'\x89\x08\x00\x00\x00\x00\x00\x00', b'\xe3\x09\x00\x00\x00\x00\x00\x00', b'\x0e\x0a\x00\x00\x00\x00\x00\x00', b'\x90\x0b\x00\x00\x00\x00\x00\x00', b'\x32\x0c\x00\x10\x01\x00\x00\x00', b'\x30\x0d\x00\x00\x00\x00\x00\x00', b'\xc2\x0e\x00\x10\x01\x00\x00\x00', b'\x68\x0f\x80\x02\x00\x00\x00\x00', ]) def test_volkswagen_mqb_crc_acc_02(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ACC_02", 0x30C, [ b'\x82\xf0\x3f\x00\x40\x30\x00\x40', b'\xe6\xf1\x3f\x00\x40\x30\x00\x40', b'\x4a\xf2\x3f\x00\x40\x30\x00\x40', b'\x2e\xf3\x3f\x00\x40\x30\x00\x40', b'\x3d\xf4\x3f\x00\x40\x30\x00\x40', b'\x59\xf5\x3f\x00\x40\x30\x00\x40', b'\xf5\xf6\x3f\x00\x40\x30\x00\x40', b'\x91\xf7\x3f\x00\x40\x30\x00\x40', b'\xd3\xf8\x3f\x00\x40\x30\x00\x40', b'\xb7\xf9\x3f\x00\x40\x30\x00\x40', b'\x1b\xfa\x3f\x00\x40\x30\x00\x40', b'\x7f\xfb\x3f\x00\x40\x30\x00\x40', b'\x6c\xfc\x3f\x00\x40\x30\x00\x40', b'\x08\xfd\x3f\x00\x40\x30\x00\x40', b'\xa4\xfe\x3f\x00\x40\x30\x00\x40', b'\xc0\xff\x3f\x00\x40\x30\x00\x40', ]) def test_volkswagen_mqb_crc_swa_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "SWA_01", 0x30F, [ b'\x10\x00\x10\x00\x00\x00\x00\x00', b'\x74\x01\x10\x00\x00\x00\x00\x00', b'\xD8\x02\x10\x00\x00\x00\x00\x00', b'\xBC\x03\x10\x00\x00\x00\x00\x00', b'\xAF\x04\x10\x00\x00\x00\x00\x00', b'\xCB\x05\x10\x00\x00\x00\x00\x00', b'\x67\x06\x10\x00\x00\x00\x00\x00', b'\x03\x07\x10\x00\x00\x00\x00\x00', b'\x41\x08\x10\x00\x00\x00\x00\x00', b'\x25\x09\x10\x00\x00\x00\x00\x00', b'\x89\x0A\x10\x00\x00\x00\x00\x00', b'\xED\x0B\x10\x00\x00\x00\x00\x00', b'\xFE\x0C\x10\x00\x00\x00\x00\x00', b'\x9A\x0D\x10\x00\x00\x00\x00\x00', b'\x36\x0E\x10\x00\x00\x00\x00\x00', b'\x52\x0F\x10\x00\x00\x00\x00\x00', ]) def test_volkswagen_mqb_crc_acc_04(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ACC_04", 0x324, [ b'\xba\x00\x00\x00\x00\x00\x00\x10', b'\xde\x01\x00\x00\x00\x00\x00\x10', b'\x72\x02\x00\x00\x00\x00\x00\x10', b'\x16\x03\x00\x00\x00\x00\x00\x10', b'\x05\x04\x00\x00\x00\x00\x00\x10', b'\x44\x05\x00\x00\x00\x00\x00\x00', b'\xe8\x06\x00\x00\x00\x00\x00\x00', b'\xa9\x07\x00\x00\x00\x00\x00\x10', b'\xeb\x08\x00\x00\x00\x00\x00\x10', b'\x8f\x09\x00\x00\x00\x00\x00\x10', b'\x06\x0a\x00\x00\x00\x00\x00\x00', b'\x47\x0b\x00\x00\x00\x00\x00\x10', b'\x71\x0c\x00\x00\x00\x00\x00\x00', b'\x15\x0d\x00\x00\x00\x00\x00\x00', b'\xb9\x0e\x00\x00\x00\x00\x00\x00', b'\xdd\x0f\x00\x00\x00\x00\x00\x00', ]) def test_volkswagen_mqb_crc_klemmen_status_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "Klemmen_Status_01", 0x3C0, [ b'\x74\x00\x03\x00', b'\xc1\x01\x03\x00', b'\x31\x02\x03\x00', b'\x84\x03\x03\x00', b'\xfe\x04\x03\x00', b'\x4b\x05\x03\x00', b'\xbb\x06\x03\x00', b'\x0e\x07\x03\x00', b'\x4f\x08\x03\x00', b'\xfa\x09\x03\x00', b'\x0a\x0a\x03\x00', b'\xbf\x0b\x03\x00', b'\xc5\x0c\x03\x00', b'\x70\x0d\x03\x00', b'\x80\x0e\x03\x00', b'\x35\x0f\x03\x00', ]) def test_volkswagen_mqb_crc_licht_anf_01(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "Licht_Anf_01", 0x3D5, [ b'\xc8\x00\x00\x04\x00\x00\x00\x00', b'\x9f\x01\x00\x04\x00\x00\x00\x00', b'\x5e\x02\x00\x04\x00\x00\x00\x00', b'\x52\x03\x00\x04\x00\x00\x00\x00', b'\xf2\x04\x00\x04\x00\x00\x00\x00', b'\x79\x05\x00\x04\x00\x00\x00\x00', b'\xe6\x06\x00\x04\x00\x00\x00\x00', b'\xfd\x07\x00\x04\x00\x00\x00\x00', b'\xf8\x08\x00\x04\x00\x00\x00\x00', b'\xc6\x09\x00\x04\x00\x00\x00\x00', b'\xf5\x0a\x00\x04\x00\x00\x00\x00', b'\x1a\x0b\x00\x04\x00\x00\x00\x00', b'\x65\x0c\x00\x04\x00\x00\x00\x00', b'\x41\x0d\x00\x04\x00\x00\x00\x00', b'\x7f\x0e\x00\x04\x00\x00\x00\x00', b'\x98\x0f\x00\x04\x00\x00\x00\x00', ]) def test_volkswagen_mqb_crc_esp_20(self, subtests): self.verify_volkswagen_mqb_crc(subtests, "ESP_20", 0x65D, [ b'\x98\x30\x2b\x10\x00\x00\x22\x81', b'\xc8\x31\x2b\x10\x00\x00\x22\x81', b'\x9d\x32\x2b\x10\x00\x00\x22\x81', b'\x1f\x33\x2b\x10\x00\x00\x22\x81', b'\x6e\x34\x2b\x10\x00\x00\x22\x81', b'\x61\x35\x2b\x10\x00\x00\x22\x81', b'\x6f\x36\x2b\x10\x00\x00\x22\x81', b'\xe5\x37\x2b\x10\x00\x00\x22\x81', b'\xf8\x38\x2b\x10\x00\x00\x22\x81', b'\xe1\x39\x2b\x10\x00\x00\x22\x81', b'\xaa\x3a\x2b\x10\x00\x00\x22\x81', b'\xe6\x3b\x2b\x10\x00\x00\x22\x81', b'\xef\x3c\x2b\x10\x00\x00\x22\x81', b'\xbb\x3d\x2b\x10\x00\x00\x22\x81', b'\x9b\x3e\x2b\x10\x00\x00\x22\x81', b'\x72\x3f\x2b\x10\x00\x00\x22\x81', ])