RaceChrono BLE Integration
Stream real-time telemetry to RaceChrono via the DIY BLE protocol
The ApexDuck dashboard supports real-time telemetry streaming to the RaceChrono motorsport data logging app over Bluetooth Low Energy (BLE). The implementation uses the RaceChrono DIY BLE protocol to broadcast 16 vehicle parameters as virtual CAN-Bus PID packets.
When enabled, the dashboard advertises as a BLE peripheral and accepts a single RaceChrono connection. All 16 channels are always streamed — there is no per-channel enable/disable. The only user-facing toggle is global BLE streaming on/off.
Two-Way Communication
The BLE link between ApexDuck and RaceChrono works in both directions, giving you a complete telemetry and timing loop over a single connection.
ApexDuck → RaceChrono
Live engine data is streamed from ApexDuck to RaceChrono, so parameters like RPM, gear, speed, coolant and oil temperatures, boost, AFR, oil pressure and battery voltage can be shown directly on the RaceChrono video overlay — perfect for on-board footage.
RaceChrono → ApexDuck
Timing data is streamed back from RaceChrono to ApexDuck, so lap times and the live delta to your reference lap appear on the ApexDuck display in real time while you drive.
The following data is received from RaceChrono:
| Parameter | Channel name |
|---|---|
| Current Lap Time | RACECHRONO_LAP_TIME |
| Previous Lap Time | RACECHRONO_PREVIOUS_LAP_TIME |
| Best Lap Time | RACECHRONO_BEST_LAP_TIME |
| Delta | RACECHRONO_DELTA_LAP_TIME |
| Lap Number | RACECHRONO_LAP_NUMBER |
| Number of satellites | RACECHRONO_SATELLITES |
| GPS Speed [km/h] | RACECHRONO_SPEED |
Setup Instructions
1. Enable BLE Streaming
Enable BLE streaming using the Configurator website.
2. Connect RaceChrono
Open RaceChrono on your phone/tablet, go to Settings → DIY CAN-Bus devices → Add new device, select RaceChrono DIY BLE as the device type, scan for BLE devices — the dashboard appears as ApexDuck_XXXX (where XXXX is the last 4 hex digits of the device MAC address, displayed on the Device Config Page). Pair and connect.
3. Configure Channels in RaceChrono
For each channel you want to log, add a new "CAN-Bus channel" in RaceChrono with the virtual PID (hex value) and the equation from the channel table below.
Channels
All 16 channels are streamed simultaneously when a client is connected.
| Channel | Virtual PID | Unit | RaceChrono Equation |
|---|---|---|---|
| RPM | 0x40000000 | rpm | A + B * 256 |
| GEAR | 0x40000001 | — | if(A > 127, A - 256, A) |
| SPEED | 0x40000002 | km/h | (A + B * 256) * 0.1 / 3.6 |
| CLT | 0x40000003 | °C | (A + B * 256) * 0.1 |
| IAT | 0x40000004 | °C | (A + B * 256) * 0.1 |
| AFR | 0x40000005 | λ×14.7 | (A + B * 256) * 0.001 |
| LAMBDA | 0x40000006 | λ | (A + B * 256) * 0.0001 |
| OIL_TEMP | 0x40000007 | °C | (A + B * 256) * 0.1 |
| GEARBOX_TEMP | 0x40000008 | °C | (A + B * 256) * 0.1 |
| BOOST | 0x40000009 | bar | if((A + B * 256) > 32767, (A + B * 256) - 65536, A + B * 256) * 0.1 |
| MAP | 0x4000000A | bar | (A + B * 256) * 0.1 |
| TPS | 0x4000000B | % | (A + B * 256) * 0.1 |
| EGT | 0x4000000C | °C | A + B * 256 |
| BATT | 0x4000000D | V | (A + B * 256) * 0.01 |
| OIL_PRESSURE | 0x4000000E | bar | (A + B * 256) * 0.1 |
| FUEL_PRESSURE | 0x4000000F | bar | (A + B * 256) * 0.1 |
Encoding: All values are little-endian uint16. A is the 1st byte, B is the 2nd byte (after the PID is stripped by RaceChrono). Full uint16 value = A + B × 256.
Units: When using RaceChrono's built-in channel types (e.g., "Speed (km/h)"), the app expects values in base SI units (m/s for speed). The speed equation includes ÷ 3.6 for the km/h → m/s conversion. For temperature channels, RaceChrono accepts °C directly. Use "Custom" channel type if you prefer no unit conversion.
Runtime-Resolved Channels
RPM, GEAR, and SPEED respect the dashboard's runtime configuration — if you configure RPM to come from CAN, the BLE stream uses the CAN RPM value as well.
Data Source Resolution
All remaining channels use EMU data when EMU Serial is the primary data provider. Otherwise, CAN data is used as the fallback source.
Connection & Advertising
- Maximum simultaneous connections: 1
- On disconnect, advertising resumes within 1000 ms
- Device name: ApexDuck_XXXX (XXXX = last 4 hex of MAC)
- Advertising interval: 100–150 ms
- Service UUID: 0x1FF8 (RaceChrono DIY)
- Base notify interval: 20 ms (50 Hz)