From 45691334e1eeaae883947269e2f32a862976a1d2 Mon Sep 17 00:00:00 2001 From: Justin Paul Date: Tue, 30 Jun 2026 14:19:57 -0400 Subject: [PATCH] registry: add remaining documented Ford 6.0 PIDs (20 -> 27) The initial registry was a curated core; add the rest of the PIDs the ford-60-pid-hunt workflow surfaced, with honest confidence tags: - doc: VGT duty (096D), Fan speed (099F) - tentative: Injection timing (09CC, *10/64 not /10), PCM battery (1172), fuel-pump duty (1672), fuel level (16C1, uncalibrated), mass-fuel-desired (1411, raw only -- no verified GPH formula) Add VGT to the driving preset. Tests still pass. Tier reminder: 'verified' = multi-source/standard or truck-confirmed; the on-truck-confirmed subset remains ICP/EBP/MAP/BARO/EOT/gear/TSS + FICM_M. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_016yT89n4zR4qbrySoSiEyZs --- obdcore/registry.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/obdcore/registry.py b/obdcore/registry.py index 101ec63..20bc5d3 100644 --- a/obdcore/registry.py +++ b/obdcore/registry.py @@ -89,6 +89,28 @@ def _build(): lambda b: round(b[0] * 100 / 255), "%", "engine", 0, 100, "verified")) a(Pid("VPCM", "Module Voltage", "01", "42", 2, lambda b: round(_u16(b) / 1000.0, 2), "V", "power", 0, 16, "verified")) + # ---- More documented PIDs from the workflow (not yet truck-verified) ---- + a(Pid("VGT", "VGT Duty Cycle", "22", "096D", 2, + lambda b: round(_u16(b) * 100 / 32767, 1), "%", "air", 0, 100, + "doc", notes="turbo vane duty")) + a(Pid("FAN", "Fan Speed", "22", "099F", 2, + lambda b: round(_u16(b) / 4), "rpm", "engine", 0, 4000, + "doc", notes="real ceiling ~3500")) + a(Pid("INJ_TIMING", "Injection Timing", "22", "09CC", 2, + lambda b: round(_u16(b) * 10 / 64, 1), "degBTDC", "fuel", -10, 30, + "tentative", notes="scaling disputed; using *10/64 (ScanGauge), not /10")) + a(Pid("VBAT", "Battery (PCM)", "22", "1172", 1, + lambda b: round(b[0] / 16, 1), "V", "power", 0, 16, + "tentative", notes="PCM-reported B+; distinct from ATRV port voltage")) + a(Pid("FUEL_PUMP", "Fuel Pump Duty (HFCM)", "22", "1672", 1, + lambda b: round(b[0] * 100 / 128, 1), "%", "fuel", 0, 100, + "tentative", notes="sits ~100%, drops on high EOT")) + a(Pid("FUEL_LVL", "Fuel Level", "22", "16C1", 2, + lambda b: round(_u16(b) * 100 / 328, 1), "%", "misc", 0, 100, + "tentative", notes="UNCALIBRATED -- needs per-truck full/empty cal")) + a(Pid("MFDES", "Mass Fuel Desired", "22", "1411", 2, + lambda b: _u16(b), "raw", "fuel", 0, 65535, + "tentative", notes="~mg/stroke internal count; no verified GPH formula")) # ---- Pseudo / derived ---- a(Pid("BATT", "Battery (OBD port)", "atrv", "", 0, None, "V", "power", 0, 16, "verified")) @@ -101,7 +123,7 @@ def _build(): # Subscription presets per perspective (key -> default poll Hz set by scheduler) PRESETS = { "crank": ["ICP", "FICM_M", "BATT", "RPM"], - "driving": ["BOOST", "EOT", "ECT", "EBP", "LOAD", "RPM", "IPR", "FICM_M", "BATT"], + "driving": ["BOOST", "VGT", "EOT", "ECT", "EBP", "LOAD", "RPM", "IPR", "BATT"], "vitals": ["ICP", "FICM_M", "FICM_L", "IPR", "BATT", "RPM", "ECT", "EOT", "IAT", "VPCM"], }