diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index fcd0845e14..dd588bf19d 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 import capnp import copy +from collections import defaultdict from dataclasses import dataclass, field import struct -from typing import Callable, Dict, List, Optional, Set, Tuple +from typing import Callable, DefaultDict, Dict, List, Optional, Set, Tuple import panda.python.uds as uds @@ -85,7 +86,7 @@ class FwQueryConfig: # Overrides and removes from essential ecus for specific models and ecus (exact matching) non_essential_ecus: Dict[capnp.lib.capnp._EnumModule, List[str]] = field(default_factory=dict) # Ecus added for data collection, not to be fingerprinted on - extra_ecus: List[Tuple[capnp.lib.capnp._EnumModule, int, Optional[int]]] = field(default_factory=list) + extra_ecus: list[EcuAddrSubAddr] = field(default_factory=list) # Function a brand can implement to provide better fuzzy matching. Takes in FW versions, # returns set of candidates. Only will match if one candidate is returned match_fw_to_car_fuzzy: Optional[Callable[[LiveFwVersions, OfflineFwVersions], Set[str]]] = None @@ -96,3 +97,15 @@ class FwQueryConfig: new_request = copy.deepcopy(self.requests[i]) new_request.bus += 4 self.requests.append(new_request) + + def get_all_ecus(self, fw_versions: OfflineFwVersions, include_ecu: bool = False, + include_extra_ecus: bool = True) -> set[EcuAddrSubAddr | AddrType]: + # Add ecus in database + extra ecus + brand_ecus = {ecu for ecus in fw_versions.values() for ecu in ecus} + + if include_extra_ecus: + brand_ecus |= set(self.extra_ecus) + + if include_ecu: + return brand_ecus + return {(addr, subaddr) for _, addr, subaddr in brand_ecus} diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index ce59bcef9c..f2ab638573 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -46,13 +46,8 @@ def build_fw_dict(fw_versions: List[capnp.lib.capnp._DynamicStructBuilder], def get_brand_addrs() -> Dict[str, Set[AddrType]]: - brand_addrs: DefaultDict[str, Set[AddrType]] = defaultdict(set) - for brand, cars in VERSIONS.items(): - # Add ecus in database + extra ecus to match against - brand_addrs[brand] |= {(addr, sub_addr) for _, addr, sub_addr in FW_QUERY_CONFIGS[brand].extra_ecus} - for fw in cars.values(): - brand_addrs[brand] |= {(addr, sub_addr) for _, addr, sub_addr in fw.keys()} - return dict(brand_addrs) + return {brand: config.get_all_ecus(VERSIONS[brand]) for + brand, config in FW_QUERY_CONFIGS.items()} def match_fw_to_car_fuzzy(live_fw_versions, match_brand=None, log=True, exclude=None): @@ -119,8 +114,8 @@ def match_fw_to_car_exact(live_fw_versions, match_brand=None, log=True, extra_fw for candidate, fws in candidates.items(): config = FW_QUERY_CONFIGS[MODEL_TO_BRAND[candidate]] - if not len(fws): - invalid.add(candidate) + # if not len(fws): + # invalid.add(candidate) for ecu, expected_versions in fws.items(): expected_versions = expected_versions + extra_fw_versions.get(candidate, {}).get(ecu, []) diff --git a/selfdrive/car/gm/fingerprints.py b/selfdrive/car/gm/fingerprints.py index e4c6f659e5..f164ae72bf 100644 --- a/selfdrive/car/gm/fingerprints.py +++ b/selfdrive/car/gm/fingerprints.py @@ -59,5 +59,5 @@ FINGERPRINTS = { } FW_VERSIONS: dict[str, dict[tuple, list[bytes]]] = { - CAR.BOLT_EUV: {}, + # CAR.BOLT_EUV: {}, }