Skip to content

OnFlight Hub and Hub Plus / Developer Manual

GDL 90 output format

Wi-Fi transport, message framing, position reports, and attitude extensions.

On this page

OnFlight Hub sends position and attitude data over Wi-Fi for compatible flight applications, including ForeFlight and Garmin Pilot. Its GDL 90 output uses a separate port and packet format from the custom UDP output.

Connection and port

Connect the receiving device to the Hub’s Wi-Fi network. The Hub broadcasts UDP datagrams to all devices on its Wi-Fi subnet using the subnet broadcast address, 192.168.23.255. The default destination port is 4000. To change it, set the GDL 90 port on the Hub’s Configuration webpage and select Update Config.

The Hub continues recording to its microSD card while streaming. For application setup, see Moving map and attitude display.

Message framing

A standard GDL 90 frame has this structure:

0x7E | message ID | message data | CRC low byte | CRC high byte | 0x7E

0x7E marks the start and end of a message. If 0x7E or 0x7D occurs inside a message, the sender replaces it with two bytes: 0x7D, then the original byte XOR 0x20. This prevents message data from being mistaken for a boundary.

To read a message, remove the start and end markers, then undo those replacements. Calculate the CRC over the message ID and message data only, and compare it with the final two bytes. GDL 90 uses its own CRC algorithm, not the log file’s Fletcher-16 checksum.

Decode each message using its field-specific byte order and scaling. Multibyte fields generally use the most significant byte first, while the CRC sends its low byte first. See sections 2.2 and 3 of the GDL 90 Data Interface Specification.

Messages and transmission rates

The Hub sends one UDP packet for every ten data updates: five packets per second at the normal 50 Hz processing rate. Each UDP packet contains several GDL 90 messages, each with its own start/end markers and CRC.

Message ID Sub-ID Rate
Heartbeat 0x00 — 1 Hz
ForeFlight device identification 0x65 0x00 1 Hz
Ownship report 0x0A — 5 Hz
Ownship geometric altitude 0x0B — 5 Hz
ForeFlight AHRS 0x65 0x01 5 Hz

Most UDP packets contain ownship, geometric altitude, and attitude/airspeed messages, in that order. Every fifth packet also begins with heartbeat and device-identification messages. Read all GDL 90 messages in each UDP packet.

Heartbeat and device identification

The heartbeat reports valid navigation when the Hub’s INS Healthy flag is set. The heartbeat timestamp and message counts are not populated.

The ForeFlight ID message reports the configured serial number, short name OnFlight, and long name OnFlight Hub. Its altitude-datum setting identifies geometric altitude as height above the WGS-84 ellipsoid.

Ownship report

“Ownship” means the aircraft carrying the Hub. Its report contains these values:

Report value Hub source Handling
Latitude and longitude lat_deg, lon_deg Valid when INS is healthy
Pressure altitude cabin_pres_alt_ft Valid when the pressure transducer is healthy
Horizontal velocity gnd_spd_kts Groundspeed; valid when INS is healthy
Vertical velocity climb_rate_ftpm Climb rate; valid when INS is healthy
Track gnd_track_deg True ground track, not heading
NIC and NAC Horizontal and vertical position accuracy Categories described below; both zero when INS is unhealthy

The sender always sets the airborne flag, emitter category 1, and emergency code 0. The airborne flag therefore does not indicate a detected takeoff or landing. The sender does not populate the participant address or callsign from aircraft metadata.

When position is invalid, the Hub sends zero latitude and longitude. Check the heartbeat and accuracy indicators rather than treating those zeros as a position. Invalid horizontal velocity is encoded as 0xFFF; invalid vertical velocity is 0x800. Cabin pressure altitude validity depends on pressure transducer health, independently of INS health. Track is still filled in when the INS is unhealthy.

Pressure altitude comes from cabin pressure; geometric altitude comes from the navigation solution. They represent different altitude references and should not be substituted for one another.

Position accuracy categories

NIC (Navigation Integrity Category) and NAC (Navigation Accuracy Category) describe position quality. The Hub chooses each category separately, starting at 11 and moving down until the reported position errors are strictly less than that category’s limits. Where both horizontal and vertical limits are listed, both must be met. A dash means that vertical accuracy is not checked. NM means nautical miles.

Category NIC horizontal limit NIC vertical limit NAC horizontal limit NAC vertical limit
11 7.5 m 11 m 3 m 4 m
10 25 m 37.5 m 10 m 15.5 m
9 75 m 112 m 30 m 45 m
8 0.1 NM — 0.05 NM —
7 0.2 NM — 0.1 NM —
6 0.6 NM — 0.3 NM —
5 1 NM — 0.5 NM —
4 2 NM — 1 NM —
3 4 NM — 2 NM —
2 8 NM — 4 NM —
1 20 NM — 10 NM —
0 No matching category — No matching category —

Geometric altitude

The geometric-altitude message reports alt_wgs84_ft, the height above the WGS-84 ellipsoid. This differs from altitude above mean sea level.

The vertical figure of merit describes altitude accuracy. It comes from vert_pos_acc_ft, converted to meters, and is marked valid only when the INS is healthy. The Hub always clears the vertical-warning flag and continues sending altitude when the INS is unhealthy. Check navigation validity before using that altitude.

Attitude and airspeed

The ForeFlight AHRS (attitude and heading reference system) message carries roll, pitch, heading, and airspeed. The Hub sends it at 5 Hz, using message ID 0x65 and sub-ID 0x01. Multibyte fields are big-endian, with the most significant byte first:

Field Encoding
Roll Two bytes, tenths of a degree; positive right wing down; 0x7FFF invalid
Pitch Two bytes, tenths of a degree; positive nose up; 0x7FFF invalid
Heading Two bytes; bit 15 selects magnetic rather than true heading; remaining bits encode tenths of a degree; 0xFFFF invalid
Indicated airspeed Two bytes, knots; 0xFFFF invalid
True airspeed Two bytes, knots; 0xFFFF invalid

Roll and pitch come from roll_deg and pitch_deg. Heading comes from true_heading_deg and is explicitly identified as true heading. All three are marked valid only when INS is healthy. Ownship track and AHRS heading are separate values.

Indicated airspeed comes from the external sensor’s ias_kts field and is marked valid while that sensor is connected. True airspeed comes from tas_kts; it also requires the sensor to report that outside air temperature is available. If those conditions are not met, the airspeed field contains the unavailable code. Groundspeed is never substituted for airspeed.

See UDP input format for the external air-data interface and the ForeFlight GDL 90 Extended Specification for the full extension layouts.

Decoder checklist

  1. Listen on the configured UDP port and process every framed message in each datagram.
  2. Remove byte escaping and validate each frame’s CRC before decoding its message ID and any extension sub-ID.
  3. Apply the individual field’s scaling, signedness, and invalid-value encoding.
  4. Use heartbeat and measurement-validity information; receiving a packet does not mean the INS is healthy.
  5. Keep pressure altitude, WGS-84 altitude, true ground track, and true heading distinct.

The base report layouts are defined in the GDL 90 Data Interface Specification.