id: 14573cee702641d0b0554f0e52179f35
parent_id: 
item_type: 1
item_id: 6ae7005d9810437093d63470cff98b59
item_updated_time: 1780732870959
title_diff: "[{\"diffs\":[[1,\"ACC — UDP Telemetry Protocol Specification\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":42}]"
body_diff: "[{\"diffs\":[[1,\"# ACC — UDP Telemetry Protocol Specification\\\n\\\n> **Game**: Assetto Corsa Competizione (2019) by Kunos Simulazioni\\\n> **Engine**: Unreal Engine 4\\\n> **Parser status**: ❌ Not implemented in rusty-telemetry\\\n> **Platform note**: Runs on Windows; Linux via Proton works but shared memory is unavailable\\\n\\\n---\\\n\\\n## Key Finding: ACC Protocol Is Completely Different from AC\\\n\\\nACC uses **Unreal Engine 4**, not AC's in-house engine. The telemetry protocol is entirely separate:\\\n- **Does NOT use** AC's KSUDP (port 9996)\\\n- **Does NOT use** AC's Telemetry Tool plugin (port 10101)\\\n- **Does NOT use** AC's Lua plugin (port 5005)\\\n- **Requires its own parser** written from scratch\\\n\\\nACC provides telemetry through two channels:\\\n1. **UDP broadcast** (cross-platform, works on Linux/Proton) — moderate data depth\\\n2. **Shared memory** (Windows only) — richer data but inaccessible on Linux\\\n\\\n---\\\n\\\n## Cross-References\\\n\\\n- **AC original protocol**: [Assetto Corsa — UDP Telemetry Protocol Specification](joplin://aed9f3be040943048273a16e05a8100f)\\\n- **AC EVO status**: [AC EVO — Telemetry Status & Research](joplin://2171d34ab9c1431ea3a979d30d206e23)\\\n- **AC Rally status**: [AC Rally — Telemetry Status & Research](joplin://b7b331aa87544b6ebe5db5b8d7bcd2a0)\\\n- **PCARS protocol**: [Project CARS 1 & 2 — UDP Telemetry Protocol Specification](joplin://c6bd2c45938246fa9d61776deae9874b)\\\n\\\n---\\\n\\\n## Connection Protocol (Registration Handshake)\\\n\\\nACC uses a **connection-oriented registration model** similar in concept to AC's KSUDP but with a completely different binary protocol:\\\n\\\n### Registration Flow\\\n\\\n1. ACC listens on a configurable UDP port (set in-game)\\\n2. Client sends a **registration request** to ACC's port\\\n3. ACC starts broadcasting telemetry packets to the client's return address\\\n4. Client must send **keep-alive** registration packets periodically (~every 10 seconds)\\\n5. If keep-alive stops, ACC stops broadcasting after a timeout (~30 seconds)\\\n\\\n### Registration Packet (Client → ACC)\\\n\\\n| Offset | Size | Type | Field | Value |\\\n|---|---|---|---|---|\\\n| 0 | 1 | uint8 | packet_type | 1 = registration request |\\\n| 1 | 4 | char[4] | display_name | Client name (e.g. \\\"rusty-telemetry\\\") |\\\n\\\n### In-Game Configuration\\\n\\\n- **Location**: Options → System → UDP Configuration\\\n- **Settings**:\\\n  - Enable UDP: On\\\n  - Target IP: `127.0.0.1` (for local analysis)\\\n  - Target Port: configurable (commonly `9000`)\\\n  - Send Rate: configurable (e.g. \\\"Second\\\" = ~1 Hz, \\\"Heavy\\\" = ~10 Hz)\\\n\\\n---\\\n\\\n## Packet Types\\\n\\\nACC uses a **multi-packet broadcast model** with distinct packet IDs:\\\n\\\n| Type ID | Name | Description | Rate |\\\n|---|---|---|---|\\\n| 0 | Entry Request | Registration/keep-alive (client → ACC) | Every ~10s |\\\n| 1 | Car Info | Driver name, car name, track name | On registration |\\\n| 2 | Car Damage | Tyre/suspension/aero damage | ~2 Hz |\\\n| 3 | Car Setup | Tyre compound, pressures, brake bias | On change |\\\n| 4 | Lap Data | Lap times, splits, positions, session state | On lap events |\\\n| 5 | Realtime Update | Speed, RPM, gear, inputs, fuel, position | ~10 Hz |\\\n| 6 | Track Map | Sector boundaries, track data | On registration |\\\n\\\n---\\\n\\\n## Broadcast 5: Realtime Car Update (Primary Physics Packet)\\\n\\\n**This is the main telemetry packet for live analysis.**\\\n\\\n### Header\\\n\\\n| Offset | Size | Type | Field |\\\n|---|---|---|---|\\\n| 0 | 1 | uint8 | packet_type = 5 |\\\n| 1 | 4 | float32_le | car_position | Race position (1-indexed) |\\\n\\\n### Per-Car Data (repeated for each car in session)\\\n\\\n| Offset | Size | Type | Field | Notes |\\\n|---|---|---|---|---|\\\n| 0 | 1 | uint8 | car_index | Unique car identifier |\\\n| 1 | 1 | uint8 | driver_index | |\\\n| 2 | 1 | uint8 | gear | Current gear (+ reverse = -1, neutral = 0) |\\\n| 3 | 2 | uint16_le | rpm | Current engine RPM × 4 (divide by 4) |\\\n| 5 | 2 | uint16_le | speed_ms | Speed in m/s × 1000 (divide by 1000) |\\\n| 7 | 2 | uint16_le | best_lap_ms | Best lap time in ms |\\\n| 9 | 2 | uint16_le | last_lap_ms | Last lap time in ms |\\\n| 11 | 2 | uint16_le | current_lap_ms | Current lap time in ms |\\\n| 13 | 2 | int16_le | world_position_x | World X (cm) |\\\n| 15 | 2 | int16_le | world_position_y | World Y (cm) |\\\n| 17 | 2 | int16_le | world_position_z | World Z (cm) |\\\n| 19 | 1 | uint8 | throttle | 0–255 |\\\n| 20 | 1 | uint8 | steer | 0–255 (128 = center) |\\\n| 21 | 1 | uint8 | brake | 0–255 |\\\n| 22 | 1 | uint8 | drs | DRS state |\\\n| 23 | 1 | uint8 | pits | Pit status |\\\n| 24 | 2 | uint16_le | fuel | Fuel remaining (liters × 10) |\\\n| 26 | 2 | uint16_le | position | Track position (0 = start/finish) |\\\n| 28 | 2 | uint16_le | laps | Completed laps |\\\n\\\n> **Note**: Exact byte offsets may vary between ACC versions. The above is based on community documentation and may need verification against live data. ACC's protocol has evolved across patches (1.0 → 1.9+).\\\n\\\n---\\\n\\\n## Broadcast 2: Car Damage\\\n\\\n| Field | Type | Notes |\\\n|---|---|---|\\\n| car_index | uint8 | |\\\n| tyre_damage | float32_le × 4 | Per-wheel (0.0 = perfect, 1.0 = destroyed) |\\\n| suspension_damage | float32_le × 4 | Per-wheel |\\\n| aero_damage | float32_le | Overall aero (0.0–1.0) |\\\n| engine_damage | float32_le | Engine wear (0.0–1.0) |\\\n\\\n---\\\n\\\n## Broadcast 3: Car Setup\\\n\\\n| Field | Type | Notes |\\\n|---|---|---|\\\n| car_index | uint8 | |\\\n| tyre_compound | uint8 | 0=Dry, 1=Wet |\\\n| tyre_pressure | float32_le × 4 | Per-wheel PSI |\\\n| brake_bias | float8 | 0.0–1.0 |\\\n\\\n---\\\n\\\n## Broadcast 4: Lap Data\\\n\\\n| Field | Type | Notes |\\\n|---|---|---|\\\n| car_index | uint8 | |\\\n| lap_time_ms | uint32_le | |\\\n| splits | float32_le × 3 | Sector times |\\\n| is_valid | bool | Lap validity |\\\n| session_type | uint8 | Practice/Qualifying/Race |\\\n\\\n---\\\n\\\n## Data Depth vs AC Telemetry Tool\\\n\\\n| Capability | AC Telemetry Tool (10101) | ACC UDP |\\\n|---|---|---|\\\n| **Update rate** | 60 Hz | ~10 Hz |\\\n| **Speed/RPM/Gear** | ✅ | ✅ |\\\n| **Driver inputs** | ✅ (float 0–1) | ✅ (uint8 0–255) |\\\n| **World position** | ✅ (float32 × 3) | ✅ (int16 × 3, cm) |\\\n| **Spline position** | ✅ (float64) | ❌ |\\\n| **G-forces** | ✅ 3-axis | ❌ (not in UDP) |\\\n| **Tyre slip ratio** | ✅ Per-wheel | ❌ |\\\n| **Tyre slip angle** | ✅ Per-wheel | ❌ |\\\n| **Tyre core temps** | ✅ Per-wheel | ❌ (only in shared memory) |\\\n| **nd_slip** | ✅ Per-wheel | ❌ |\\\n| **Multi-car** | ✅ All drivers | ✅ All drivers |\\\n| **Damage model** | ❌ | ✅ Per-wheel + aero + engine |\\\n| **Tyre pressures** | ❌ | ✅ In setup packet |\\\n| **Fuel** | ❌ | ✅ In realtime packet |\\\n| **Lap validity** | ✅ | ✅ |\\\n| **Weather** | ❌ | ✅ |\\\n| **Tyre compound** | ✅ (string) | ✅ (enum) |\\\n\\\n### Key ACC Limitations (vs AC Telemetry Tool)\\\n\\\n1. **No G-force data in UDP** — only available via Windows shared memory\\\n2. **No tyre physics detail** — no slip ratios, slip angles, tyre temps in UDP\\\n3. **No spline position** — track progress must be calculated from world coordinates\\\n4. **Lower update rate** — 10 Hz vs 60 Hz\\\n5. **Quantized values** — uint8/uint16 instead of float32, reduced precision\\\n6. **No velocity vectors** — no world/local velocity in UDP\\\n\\\n### ACC Advantages (vs AC Telemetry Tool)\\\n\\\n1. **Damage model** — per-wheel + aero + engine damage tracking\\\n2. **Fuel management** — fuel remaining in liters\\\n3. **Tyre pressures** — actual PSI values per wheel\\\n4. **Official protocol** — documented by Kunos, not dependent on third-party plugin\\\n5. **Tyre compound** — wet/dry selection\\\n6. **Weather data** — track/ambient conditions\\\n\\\n---\\\n\\\n## Shared Memory (Windows Only — NOT Available on Linux)\\\n\\\nACC exposes more detailed data via Windows shared memory:\\\n- Physical memory mapped file: `Local\\\\ACCUdpSharedMemory`\\\n- Contains: full physics state, tyre temps, G-forces, suspension details\\\n- **Not accessible on Linux/Proton** — the Wine/Proton shared memory translation layer does not support this\\\n\\\nThis is why ACC UDP telemetry analysis on Linux is more limited than on Windows.\\\n\\\n---\\\n\\\n## Rust Implementation Plan\\\n\\\n### Recommended Port\\\n\\\n| Port | Use |\\\n|---|---|\\\n| Configurable (default: 9000) | ACC UDP telemetry |\\\n\\\n### Parser Architecture\\\n\\\n```\\\nsrc/\\\n  parser_acc.rs          — Main ACC UDP parser\\\n  acc_registration.rs    — Registration/keep-alive handler\\\n```\\\n\\\n### Implementation Steps\\\n\\\n1. **Registration handler**: Send periodic keep-alive packets to ACC's port\\\n2. **Packet dispatcher**: Read byte 0 for packet type, dispatch to type-specific parser\\\n3. **Realtime update parser** (type 5): Speed, RPM, gear, inputs, fuel, position\\\n4. **Damage parser** (type 2): Per-wheel + aero + engine damage\\\n5. **Setup parser** (type 3): Tyre pressures, brake bias\\\n6. **Lap data parser** (type 4): Lap times, sectors, validity\\\n7. **Track map parser** (type 6): Sector boundaries\\\n\\\n### Estimated Effort\\\n\\\n~5–7 days for a complete ACC parser with all packet types, assuming live data available for verification.\\\n\\\n---\\\n\\\n## Live Verification Needed\\\n\\\n**No ACC data has been captured yet.** The protocol structure above is based on community documentation. Verification requires:\\\n1. ACC installed and configured for UDP output\\\n2. rusty-telemetry listening on the configured port\\\n3. Registration packet sent and ACC responding\\\n4. Packet captures to verify byte offsets against documentation\\\n\\\n---\\\n\\\n*Created: 2026-06-06*\\\n*Status: Research phase — no live verification yet*\\\n*Next step: Install ACC, configure UDP, capture and verify packets*\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":9130}]"
metadata_diff: {"new":{"id":"6ae7005d9810437093d63470cff98b59","parent_id":"0e8e00b432a840628faa4df5bc2068bc","latitude":"0.00000000","longitude":"0.00000000","altitude":"0.0000","author":"","source_url":"","is_todo":0,"todo_due":0,"todo_completed":0,"source":"joplin-desktop","source_application":"net.cozic.joplin-desktop","application_data":"","order":1780732492419,"markup_language":1,"is_shared":0,"share_id":"","conflict_original_id":"","master_key_id":"","user_data":"","deleted_time":0},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-06T08:04:09.657Z
created_time: 2026-06-06T08:04:09.657Z
type_: 13