From 515cb578ea2185678dc02ae44a04cea6c1166284 Mon Sep 17 00:00:00 2001 From: Jeff Verkoeyen Date: Tue, 25 Nov 2025 04:51:57 -0500 Subject: [PATCH 1/2] Sync template updates and remove deprecated files --- .claude/settings.local.json | 14 ----- .github/workflows/presubmits.yml | 5 +- .github/workflows/response_tests.yml | 65 +++++++++++++-------- .gitignore | 3 + .vscode/settings.json | 8 --- .vscode/tasks.json | 11 ---- tests/test_responses.py | 84 ---------------------------- 7 files changed, 46 insertions(+), 144 deletions(-) delete mode 100644 .claude/settings.local.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json delete mode 100644 tests/test_responses.py diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index b1f30b1..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(cat:*)", - "Bash(comm -23:*)", - "Bash(jq:*)", - "Skill(obdb-editor)", - "Bash(python3:*)", - "Bash(find:*)" - ], - "deny": [], - "ask": [] - } -} diff --git a/.github/workflows/presubmits.yml b/.github/workflows/presubmits.yml index 8fde996..9732469 100644 --- a/.github/workflows/presubmits.yml +++ b/.github/workflows/presubmits.yml @@ -1,4 +1,4 @@ -name: json-yaml-validate +name: json-yaml-validate on: push: branches: @@ -13,17 +13,14 @@ jobs: validate-signals: runs-on: ubuntu-latest steps: - # Step 1: Check out the current repository - uses: actions/checkout@v4 - # Step 2: Check out the central schema repository - name: Checkout schemas repo uses: actions/checkout@v4 with: repository: OBDb/.schemas path: .schemas - # Step 3: Validate with schema from the central repository - name: Validate signalsets id: json-yaml-validate-v3 uses: GrantBirki/json-yaml-validate@v2.7.1 diff --git a/.github/workflows/response_tests.yml b/.github/workflows/response_tests.yml index ac8e45f..5aea0ea 100644 --- a/.github/workflows/response_tests.yml +++ b/.github/workflows/response_tests.yml @@ -8,39 +8,58 @@ on: permissions: contents: read + pull-requests: write jobs: test: runs-on: ubuntu-latest steps: - - name: Checkout main repository + - name: Checkout repository uses: actions/checkout@v4 - - name: Checkout schemas repo - uses: actions/checkout@v4 + - name: Run tests in devcontainer + id: test + uses: devcontainers/ci@v0.3 with: - repository: OBDb/.schemas - path: tests/schemas + imageName: ghcr.io/obdb/devcontainer + push: never + env: | + GITHUB_SERVER_URL=${{ github.server_url }} + GITHUB_REPOSITORY=${{ github.repository }} + GITHUB_SHA=${{ github.sha }} + GITHUB_RUN_ID=${{ github.run_id }} + runCmd: | + pytest tests/ --ignore=tests/schemas -xvs -n auto > ./test-output.txt 2>&1 + TEST_EXIT=$? + cat ./test-output.txt - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.13' - cache: 'pip' + # Format results for PR comment with all required arguments + /usr/local/bin/format-test-results.sh \ + test-output.txt \ + $TEST_EXIT \ + "$GITHUB_SERVER_URL" \ + "$GITHUB_REPOSITORY" \ + "$GITHUB_SHA" \ + "$GITHUB_RUN_ID" \ + > ./test-results.md || true - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r tests/schemas/requirements.txt + # Exit with the actual test result + exit $TEST_EXIT - - name: Run tests - id: run_tests + - name: Set test results output + if: always() && github.event_name == 'pull_request' run: | - pytest tests/ --ignore=tests/schemas -xvs -n auto - continue-on-error: true + if [ -f test-results.md ]; then + { + echo 'TEST_RESULTS<> $GITHUB_ENV + fi - - name: Print fix instructions - if: steps.run_tests.outcome == 'failure' - run: | - echo "::notice title=How to fix failed tests::To fix the failed tests, run: python3 tests/update_yaml_tests.py --verbose" - exit 1 + - name: Comment test results on PR + if: always() && github.event_name == 'pull_request' + uses: thollander/actions-comment-pull-request@v2 + with: + message: ${{ env.TEST_RESULTS }} + comment_tag: response-tests diff --git a/.gitignore b/.gitignore index 9dd2f83..17717bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ tests/schemas/ __pycache__ .claude/skills +.claude/settings.local.json +tests/*.py +.vscode/*.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 39e117a..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "python.testing.pytestArgs": [ - "tests" - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "files.trimTrailingWhitespace": true -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 41eed86..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Format Signals", - "type": "shell", - "command": "find signalsets/v3 -type f -exec python3 tests/schemas/cli.py '{}' --output '{}' \\;", - "problemMatcher": [] - } - ] -} diff --git a/tests/test_responses.py b/tests/test_responses.py deleted file mode 100644 index 1e72c3f..0000000 --- a/tests/test_responses.py +++ /dev/null @@ -1,84 +0,0 @@ -import glob -import os -import pytest -from pathlib import Path -from typing import Dict, Any - -# These will be imported from the schemas repository -from schemas.python.can.can_frame import CANIDFormat -from schemas.python.json_formatter import format_file -from schemas.python.signals_testing import obd_testrunner - -REPO_ROOT = Path(__file__).parent.parent.absolute() - -TEST_CASES = [ - # TODO: Implement real tests below with vehicle data. - # 2019 model year - { - "model_year": "2019", - "signalset": "default.json", - "tests": [ - # # Tire pressures - # ("72E05622813028C", {"F150_TP_FL": 32.6}), - # ("72E056228140273", {"F150_TP_FR": 31.35}), - # ("72E056228150291", {"F150_TP_RRO": 32.85}), - # ("72E05622816026E", {"F150_TP_RLO": 31.1}), - # ("72E056228170000", {"F150_TP_RRI": 0.0}), - # ("72E056228180000", {"F150_TP_RLI": 0.0}), - ] - }, -] - -def load_signalset(filename: str) -> str: - """Load a signalset JSON file from the standard location.""" - signalset_path = REPO_ROOT / "signalsets" / "v3" / filename - with open(signalset_path) as f: - return f.read() - -@pytest.mark.parametrize( - "test_group", - TEST_CASES, - ids=lambda test_case: f"MY{test_case['model_year']}" -) -def test_signals(test_group: Dict[str, Any]): - """Test signal decoding against known responses.""" - signalset_json = load_signalset(test_group["signalset"]) - - # Run each test case in the group - for response_hex, expected_values in test_group["tests"]: - try: - obd_testrunner( - signalset_json, - response_hex, - expected_values, - can_id_format=CANIDFormat.ELEVEN_BIT - ) - except Exception as e: - pytest.fail( - f"Failed on response {response_hex} " - f"(Model Year: {test_group['model_year']}, " - f"Signalset: {test_group['signalset']}): {e}" - ) - -def get_json_files(): - """Get all JSON files from the signalsets/v3 directory.""" - signalsets_path = os.path.join(REPO_ROOT, 'signalsets', 'v3') - json_files = glob.glob(os.path.join(signalsets_path, '*.json')) - # Convert full paths to relative filenames - return [os.path.basename(f) for f in json_files] - -@pytest.mark.parametrize("test_file", - get_json_files(), - ids=lambda x: x.split('.')[0].replace('-', '_') # Create readable test IDs -) -def test_formatting(test_file): - """Test signal set formatting for all vehicle models in signalsets/v3/.""" - signalset_path = os.path.join(REPO_ROOT, 'signalsets', 'v3', test_file) - - formatted = format_file(signalset_path) - - with open(signalset_path) as f: - assert f.read() == formatted - -if __name__ == '__main__': - pytest.main([__file__]) From c75cda32bbe1beeb199089513f653b8f9ae987f0 Mon Sep 17 00:00:00 2001 From: Jeff Verkoeyen Date: Sat, 29 Nov 2025 14:48:23 -0500 Subject: [PATCH 2/2] Update trims. --- signalsets/v3/default.json | 54 ++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 5279d35..5e70d83 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -72,21 +72,21 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "06"}, "freq": 0.25, "signals": [ - {"id": "SHRTFT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Short term fuel trim (bank 1)", "suggestedMetric": "shortTermFuelTrim", "description": "Correction being used by the closed-loop fuel algorithm."} + {"id": "SHRTFT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short term fuel trim (bank 1)", "suggestedMetric": "shortTermFuelTrim", "description": "Correction being used by the closed-loop fuel algorithm."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "07"}, "freq": 1, "signals": [ - {"id": "LONGFT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Long term fuel trim (bank 1)"} + {"id": "LONGFT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long term fuel trim (bank 1)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "08"}, "freq": 1, "signals": [ - {"id": "SHRTFT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Short term fuel trim (bank 2)", "suggestedMetric": "shortTermFuelTrim", "description": "Correction being used by the closed-loop fuel algorithm."}, - {"id": "SHRTFT4", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Short term fuel trim (bank 4)", "description": "Correction being used by the closed-loop fuel algorithm."} + {"id": "SHRTFT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short term fuel trim (bank 2)", "suggestedMetric": "shortTermFuelTrim", "description": "Correction being used by the closed-loop fuel algorithm."}, + {"id": "SHRTFT4", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short term fuel trim (bank 4)", "description": "Correction being used by the closed-loop fuel algorithm."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "09"}, "freq": 1, "signals": [ - {"id": "LONGFT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Long term fuel trim (bank 2)"}, - {"id": "LONGFT4", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Long term fuel trim (bank 4)"} + {"id": "LONGFT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long term fuel trim (bank 2)"}, + {"id": "LONGFT4", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long term fuel trim (bank 4)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "0A"}, "freq": 1, "signals": [ @@ -267,7 +267,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "2D"}, "freq": 1, "signals": [ - {"id": "EGR_ERR", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "EGR error"} + {"id": "EGR_ERR", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "EGR error"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "2E"}, "freq": 1, "signals": [ @@ -459,19 +459,19 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "55"}, "freq": 0.25, "signals": [ - {"id": "STSO2FT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Short term secondary O2 sensor fuel trim (bank 1)"} + {"id": "STSO2FT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short term secondary O2 sensor fuel trim (bank 1)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "56"}, "freq": 0.25, "signals": [ - {"id": "LGSO2FT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Long term secondary O2 sensor fuel trim (bank 1)"} + {"id": "LGSO2FT1", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long term secondary O2 sensor fuel trim (bank 1)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "57"}, "freq": 0.25, "signals": [ - {"id": "STSO2FT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Short term secondary O2 sensor fuel trim (bank 2)"} + {"id": "STSO2FT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short term secondary O2 sensor fuel trim (bank 2)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "58"}, "freq": 0.25, "signals": [ - {"id": "LGSO2FT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "Long term secondary O2 sensor fuel trim (bank 2)"} + {"id": "LGSO2FT2", "path": "Engine.Generic", "fmt": { "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long term secondary O2 sensor fuel trim (bank 2)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "59"}, "freq": 0.25, "signals": [ @@ -579,29 +579,25 @@ {"id": "EGR_A_CMD_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "Commanded EGR A supported", "hidden": true}, {"id": "EGR_A_CMD", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded EGR A duty cycle/position"}, {"id": "EGR_A_ACT", "path": "Engine.Generic", "fmt": {"bix": 16, "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Actual EGR A duty cycle/position"}, - {"id": "EGR_A_ERR", "path": "Engine.Generic", "fmt": {"bix": 24, "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "EGR A error"}, + {"id": "EGR_A_ERR", "path": "Engine.Generic", "fmt": {"bix": 24, "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "EGR A error"}, {"id": "EGR_B_CMD", "path": "Engine.Generic", "fmt": {"bix": 32, "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded EGR B duty cycle/position"}, {"id": "EGR_B_ACT", "path": "Engine.Generic", "fmt": {"bix": 40, "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Actual EGR B duty cycle/position"}, - {"id": "EGR_B_ERR", "path": "Engine.Generic", "fmt": {"bix": 48, "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -128, "unit": "percent" }, "name": "EGR B error"} + {"id": "EGR_B_ERR", "path": "Engine.Generic", "fmt": {"bix": 48, "len": 8, "max": 99.22, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "EGR B error"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "6B"}, "freq": 0.25, "signals": [ - {"id": "EGRTD_WR_SUP", "path": "Engine.Generic.Internal", "fmt": { "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor D (Bank 2, Sensor 2) Wide Range supported?", "hidden": true}, - {"id": "EGRTB_WR_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 1, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor B (Bank 2, Sensor 1) Wide Range supported?", "hidden": true}, - {"id": "EGRTC_WR_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 2, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor C (Bank 1, Sensor 2) Wide Range supported?", "hidden": true}, - {"id": "EGRTA_WR_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 3, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor A (Bank 1, Sensor 1) Wide Range supported?", "hidden": true}, - {"id": "EGRTD_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 4, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor D (Bank 2, Sensor 2) supported?", "hidden": true}, - {"id": "EGRTB_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 5, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor B (Bank 2, Sensor 1) supported?", "hidden": true}, - {"id": "EGRTC_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 6, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor C (Bank 1, Sensor 2) supported?", "hidden": true}, - {"id": "EGRTA_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor A (Bank 1, Sensor 1) supported?", "hidden": true}, - {"id": "EGRTA", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor A (Bank 1, Sensor 1)"}, - {"id": "EGRTA_WIDE", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 980, "min": -40, "mul": 4, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor A (Bank 1, Sensor 1), wide"}, - {"id": "EGRTC", "path": "Engine.Generic", "fmt": {"bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor C (Bank 1, Sensor 2)"}, - {"id": "EGRTC_WIDE", "path": "Engine.Generic", "fmt": {"bix": 16, "len": 8, "max": 980, "min": -40, "mul": 4, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor C (Bank 1, Sensor 2), wide"}, - {"id": "EGRTB", "path": "Engine.Generic", "fmt": {"bix": 24, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor B (Bank 2, Sensor 1)"}, - {"id": "EGRTB_WIDE", "path": "Engine.Generic", "fmt": {"bix": 24, "len": 8, "max": 980, "min": -40, "mul": 4, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor B (Bank 2, Sensor 1), wide"}, - {"id": "EGRTD", "path": "Engine.Generic", "fmt": {"bix": 32, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor D (Bank 2, Sensor 2)"}, - {"id": "EGRTD_WIDE", "path": "Engine.Generic", "fmt": {"bix": 32, "len": 8, "max": 980, "min": -40, "mul": 4, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor D (Bank 2, Sensor 2), wide"} + {"id": "EGRTD_WR_SUP", "path": "Engine.Generic.Internal", "fmt": { "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor D (Bank 2, Sensor 2) Wide Range supported?", "hidden": true}, + {"id": "EGRTB_WR_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 1, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor B (Bank 2, Sensor 1) Wide Range supported?", "hidden": true}, + {"id": "EGRTC_WR_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 2, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor C (Bank 1, Sensor 2) Wide Range supported?", "hidden": true}, + {"id": "EGRTA_WR_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 3, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor A (Bank 1, Sensor 1) Wide Range supported?", "hidden": true}, + {"id": "EGRTD_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 4, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor D (Bank 2, Sensor 2) supported?", "hidden": true}, + {"id": "EGRTB_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 5, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor B (Bank 2, Sensor 1) supported?", "hidden": true}, + {"id": "EGRTC_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 6, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor C (Bank 1, Sensor 2) supported?", "hidden": true}, + {"id": "EGRTA_SUP", "path": "Engine.Generic.Internal", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "EGR Temperature Sensor A (Bank 1, Sensor 1) supported?", "hidden": true}, + {"id": "EGRTA", "path": "Engine.Generic", "fmt": {"bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor A (Bank 1, Sensor 1)"}, + {"id": "EGRTC", "path": "Engine.Generic", "fmt": {"bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor C (Bank 1, Sensor 2)"}, + {"id": "EGRTB", "path": "Engine.Generic", "fmt": {"bix": 24, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor B (Bank 2, Sensor 1)"}, + {"id": "EGRTD", "path": "Engine.Generic", "fmt": {"bix": 32, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Exhaust Gas Recirculation Temp Sensor D (Bank 2, Sensor 2)"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"01": "6C"}, "freq": 0.25, "signals": [