"""obdcore -- headless, vehicle-agnostic OBD-II acquisition core. Vehicle data (PIDs, scaling, DTCs, presets) lives in JSON profiles under profiles/ -- loaded at runtime, not hardcoded -- so the app works across vehicles and others can contribute profiles. formula.py safe A/B/... scaling-formula evaluator (no code execution) profile.py load/save/list vehicle profiles (JSON) registry.py PidRegistry / DtcDatabase model + lookups link.py ElmLink ELM327 serial transport (+ MockLink in mock.py) scheduler.py PollScheduler prioritized polling engine store.py TimeSeriesStore ring buffers + record/replay See ARCHITECTURE.md and profiles/README.md. """ from .registry import PidRegistry, DtcDatabase, Pid, Dtc from .profile import (Profile, load_profile, save_profile, list_profiles, profiles_dir, default_profile_path, load_default) from .formula import compile_formula, FormulaError from .store import TimeSeriesStore, CsvRecorder, replay_csv, export_csv from .scheduler import PollScheduler __all__ = [ "PidRegistry", "DtcDatabase", "Pid", "Dtc", "Profile", "load_profile", "save_profile", "list_profiles", "profiles_dir", "default_profile_path", "load_default", "compile_formula", "FormulaError", "TimeSeriesStore", "CsvRecorder", "replay_csv", "export_csv", "PollScheduler", ]