|
|
|
@ -1,10 +1,11 @@ |
|
|
|
|
import re |
|
|
|
|
from collections import defaultdict |
|
|
|
|
from datetime import datetime |
|
|
|
|
from dateutil import rrule |
|
|
|
|
from collections import defaultdict |
|
|
|
|
from dataclasses import dataclass |
|
|
|
|
from enum import Enum, IntFlag |
|
|
|
|
from typing import DefaultDict, Dict, List, Optional, Set, Union |
|
|
|
|
import functools |
|
|
|
|
from typing import DefaultDict, Dict, List, Optional, Set, Tuple, Union |
|
|
|
|
|
|
|
|
|
from cereal import car |
|
|
|
|
from panda.python import uds |
|
|
|
@ -348,6 +349,29 @@ FINGERPRINTS = { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@functools.cache |
|
|
|
|
def parse_platform_code(fw_version: bytes) -> Tuple[Optional[bytes], Optional[bytes]]: |
|
|
|
|
match = PLATFORM_CODE_PATTERN.search(fw_version) |
|
|
|
|
code, date = None, None |
|
|
|
|
if match is not None: |
|
|
|
|
code, date = match.groups() |
|
|
|
|
return code, date |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def hyundai_fuzzy(fw_versions_dict) -> Set[str]: |
|
|
|
|
all_platform_codes = defaultdict(set) |
|
|
|
|
for candidate, fw_by_addr in FW_VERSIONS.items(): |
|
|
|
|
for addr, fws in fw_by_addr.items(): |
|
|
|
|
if addr[0] not in FW_QUERY_CONFIG.platform_code_ecus: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
for fw in fws: |
|
|
|
|
code, date = parse_platform_code(fw) |
|
|
|
|
if code is not None: |
|
|
|
|
all_platform_codes[(addr[1], addr[2], code)].add(candidate) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_platform_codes(fw_versions: List[bytes]) -> Set[bytes]: |
|
|
|
|
codes: DefaultDict[bytes, Set[bytes]] = defaultdict(set) |
|
|
|
|
for fw in fw_versions: |
|
|
|
|