Add generic SAE DTC database (1409 codes) with profile-priority fallback

Compiled by the generic-dtc-db workflow (P0/U0/C0/B0 standard codes, system
tags + no-start flags). Lives in profiles/_data/generic-dtcs.json (bundled with
profiles/, not listed as a vehicle profile). DtcDatabase.get now falls back:
profile code -> generic code -> unknown, so any standard code resolves to a
description while vehicle profiles still override (e.g. P0148 keeps the 6.0 text).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yT89n4zR4qbrySoSiEyZs
This commit is contained in:
2026-06-30 19:40:02 -04:00
parent 6c1ee0c81d
commit 4a4daf3fa0
2 changed files with 8483 additions and 2 deletions
+25 -2
View File
@@ -81,12 +81,35 @@ class PidRegistry:
return list(self.presets.keys())
_GENERIC = None
def _generic_dtcs():
"""Lazy-load the bundled generic SAE DTC database (code -> Dtc)."""
global _GENERIC
if _GENERIC is None:
_GENERIC = {}
try:
import json
import os
from .profile import profiles_dir
path = os.path.join(profiles_dir(), "_data", "generic-dtcs.json")
for d in json.load(open(path)).get("dtcs", []):
_GENERIC[d["code"]] = Dtc(code=d["code"], desc=d.get("desc", ""),
system=d.get("system", "powertrain"),
no_start=d.get("no_start", False))
except Exception:
pass
return _GENERIC
class DtcDatabase:
def __init__(self, profile):
self._db = {d.code: d for d in profile.dtcs}
self._db = {d.code: d for d in profile.dtcs} # profile codes take priority
def get(self, code):
return self._db.get(code) or Dtc(code, "(unknown - look up this code)")
return (self._db.get(code) or _generic_dtcs().get(code)
or Dtc(code, "(unknown - look up this code)"))
def all(self):
return list(self._db.values())