Skip to content

Connecting a Timer

A timer is GridFPV's source of truth for what happens on the track — every time a drone crosses the gate. You set a timer up once under Timers on the home hub, then select it for an event. This page covers the built-in Mock timer, connecting RotorHazard, what channels and nodes mean, and the heat lifecycle from the race director's seat.

The built-in Mock timer

The Mock timer is a built-in simulator. It produces realistic gate crossings with no hardware at all, so you can learn the whole race flow, rehearse an event setup, or demo GridFPV on a single laptop. The Mock timer ships with the app and is always ready — there is nothing to connect.

To add or tune one:

  1. Open Timers on the home hub and click + Add timer (a built-in Mock is already there to use as-is).
  2. Set the Kind to Mock (synthetic).
  3. Optionally adjust:
    • Laps — how many laps each simulated pilot flies.
    • Lap pace (ms) — the nominal time for one simulated lap.
  4. Save. Now select the Mock timer for your event (in the setup wizard or on the event's Timers stage).

Test the whole flow with the simulator

Add a Mock timer, create an event, and run a heat through Stage → Start → finish → Finalize. It is the fastest way to learn race control and to sanity-check an event before you are at the field with real gear.

RotorHazard

RotorHazard is a popular open-source RF timing system. GridFPV connects to it over its web server and talks to the GridFPV RotorHazard plugin running inside RH (RotorHazard 4.3.0 or newer). If the plugin isn't installed yet, GridFPV detects that and walks you through a one-step install when you connect.

Connect it

  1. Make sure your RotorHazard server is running and reachable on your network. Note its server URL — the same address you open RotorHazard's own web interface at, for example http://localhost:5000 or http://192.168.1.40:5000.
  2. In GridFPV, open Timers → + Add timer and set the Kind to RotorHazard.
  3. Enter the URL and save.
  4. Select the RotorHazard timer for your event. GridFPV connects when the timer is selected for the active event and keeps the link alive between heats.

The timer's status pill shows where the connection stands — Ready, Connecting, Connected, Disconnected, or Error.

Double-detections are handled in GridFPV

A gate reflection can register two crossings milliseconds apart. GridFPV enforces its own per-round minimum lap time (default 5s on new rounds): a crossing that would close a shorter lap is auto-removed, visibly, with a marshal Restore override — regardless of the timer's own min-lap settings. See Marshaling.

Channels vs nodes

These are two different things, and the difference matters when you set up a timer:

  • Nodes are the timer's physical receivers — its node count caps how many pilots can be in one heat. An 8-node timer runs heats of up to 8 pilots.
  • Channels are the frequencies the timer can tune to. A timer can offer more channels than it has nodes — say 8 available channels on a 4-node timer — so you can choose which channels a given heat uses.

When you configure a timer you set both: its node count (default 8) and its available channels (ticked from the standard FPV catalog — Raceband, Fatshark, and so on — plus custom frequencies for flexible timers).

Assigning channels

Per-pilot channels come from your event's primary timer:

  • Time Trials use static channels — each pilot keeps a fixed channel you assign on Classes & Roster. Use Auto-assign channels to spread the pool across the field, then override anyone as needed.
  • Head-to-Head rounds assign channels per heat from the timer's pool, so each group gets clean, conflict-free frequencies.

The heat lifecycle

Every heat moves through the same clear sequence of states. Knowing them makes race control predictable:

StateWhat it means
ScheduledThe heat exists with its lineup, but hasn't started.
StagedThe staging countdown is underway — pilots to the line. It is informational; nothing auto-advances.
ArmedThe start procedure is running (announce → randomized hold → tone).
RunningThe race is live; gate crossings count.
UnofficialThe race has closed but the result is still provisional — late crossings and corrections can still land.
FinalThe result is locked in.

The race director's commands

From Race Control you drive the heat with a few actions:

  • Stage — move a Scheduled heat to Staged and start the staging countdown.
  • Start — arm a Staged heat and run the start procedure (the countdown runs itself).
  • Stop — end a Running race now; pilots land and the result stands as flown.
  • Finalize — lock an Unofficial heat as Final; Advance moves on to the next heat.
  • Abort / Restart — reset the heat all the way back to Scheduled so you can re-stage it; Discard throws the heat out entirely. (The destructive ones ask for confirmation.)

The start procedure

When you Start a staged heat, it arms and runs a start procedure before going live:

  1. A short randomized hold — a brief delay (a couple of seconds, randomized per the round's start procedure) so pilots can't anticipate the exact go.
  2. The start tone — GridFPV plays the audible go-tone itself.

The instant the hold elapses, the heat moves to Running on its own — listen for the tone. Procedure audio (start tone, end-of-race countdown pips, race-end buzzer) is always on and plays whatever page you're on; the spoken lap callouts are the informational layer, muted by the Callouts toggle in Race Control.

How a heat ends

A Running heat ends on its own when its win condition is met, plus a grace window (default 30s) that lets late crossings still count. The heat then moves to Unofficial, where you can review and correct it in Marshaling before you Finalize it. To end it early, press Stop.

Choosing the current heat

Race Control runs one heat at a time. A heat picker at the top lets you choose which heat is current — but it locks once a heat is staged or running, so you can't switch mid-race. Finalize or abort the current heat to unlock it. Filled heats are named <Round> Heat N (for example Qualifying Heat 1), which is what you'll see in the picker.

Released under the AGPL-3.0 License.