| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -320,41 +320,32 @@ FINGERPRINTS = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def get_platform_codes(fw_versions_dict): | 
					 | 
					 | 
					 | 
					def get_platform_codes(fw_versions): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  codes = set() | 
					 | 
					 | 
					 | 
					  codes = set() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  key = (Ecu.fwdRadar, 0x7d0, None) if (Ecu.fwdRadar, 0x7d0, None) in fw_versions_dict else (0x7d0, None) | 
					 | 
					 | 
					 | 
					  platform_code_prefix = HYUNDAI_VERSION_REQUEST_LONG[1:] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # key = if from_db else (0x7d0, None)) | 
					 | 
					 | 
					 | 
					  for fw in fw_versions: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # for fw in fw_versions_dict[(Ecu.fwdRadar, 0x7d0, None)]: | 
					 | 
					 | 
					 | 
					    start_idx = fw.index(platform_code_prefix) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # for fw in fw_versions_dict[(0x7d0, None)]:  # fwdRadar | 
					 | 
					 | 
					 | 
					    code = fw[start_idx + len(platform_code_prefix):][:4]  # Hyundai platform code is max 4 bytes | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for fw in fw_versions_dict[key]:  # fwdRadar | 
					 | 
					 | 
					 | 
					    codes.add(code.replace(b" ", b"").replace(b"_", b"")) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    start_idx = fw.index(b'\xf1\x00') | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    fw = fw[start_idx + 2:][:4] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    match = re.match(br'([A-Z]+[A-Z0-9]*)', fw) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if match is None: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      return None | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    code = match.group(0) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    radar_code_variant = fw[len(code):4].replace(b'_', b'').replace(b' ', b'') | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    codes.add((code, radar_code_variant)) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return codes | 
					 | 
					 | 
					 | 
					  return codes | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def match_fw_to_hyundai_fuzzy(fw_versions_dict): | 
					 | 
					 | 
					 | 
					def match_fw_to_hyundai_fuzzy(fw_versions_dict): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  platform_codes = get_platform_codes(fw_versions_dict) | 
					 | 
					 | 
					 | 
					  platform_codes_radar = get_platform_codes(fw_versions_dict[(0x7d0, None)]) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if platform_codes is None or len(platform_codes) != 1: | 
					 | 
					 | 
					 | 
					  platform_codes_camera = get_platform_codes(fw_versions_dict[(0x7c4, None)]) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  if len(platform_codes_radar) != 1 or len(platform_codes_camera) != 1: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return set() | 
					 | 
					 | 
					 | 
					    return set() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  platform_code = list(platform_codes)[0] | 
					 | 
					 | 
					 | 
					  platform_code_radar = list(platform_codes_radar)[0] | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  platform_codes_camera = list(platform_codes_camera)[0] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  invalid = [] | 
					 | 
					 | 
					 | 
					  invalid = [] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  candidates = FW_VERSIONS | 
					 | 
					 | 
					 | 
					  candidates = FW_VERSIONS | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for candidate, fws in candidates.items(): | 
					 | 
					 | 
					 | 
					  for candidate, fws in candidates.items(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    candidate_platform_codes = get_platform_codes(fws) | 
					 | 
					 | 
					 | 
					    candidate_platform_codes_radar = get_platform_codes(fws[(Ecu.fwdRadar, 0x7d0, None)]) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    print(f"{candidate:36}", platform_code, candidate_platform_codes, platform_code in candidate_platform_codes) | 
					 | 
					 | 
					 | 
					    candidate_platform_codes_camera = get_platform_codes(fws[(Ecu.fwdCamera, 0x7c4, None)]) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if platform_code not in candidate_platform_codes: | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if not (platform_code_radar in candidate_platform_codes_radar and platform_codes_camera in candidate_platform_codes_camera): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      invalid.append(candidate) | 
					 | 
					 | 
					 | 
					      invalid.append(candidate) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return set(candidates.keys()) - set(invalid) | 
					 | 
					 | 
					 | 
					  return set(candidates.keys()) - set(invalid) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |