Telemetry Schemas & Normalization
GameGlue uses a schema system to normalize telemetry data across different simulators. This means you can write code that works with any supported sim without worrying about their different field names.
The Problem
Different simulators use different names for the same data:
| Data | MSFS | X-Plane |
|---|---|---|
| Heading | heading_gyro | hdg_mag |
| Airspeed | indicated_airspeed | ias |
| Altitude | indicated_altitude | alt_msl |
Without normalization, you'd need to write different code for each simulator:
javascript
// Without normalization - simulator-specific code
if (game === 'msfs') {
altitude = data.indicated_altitude;
} else if (game === 'xplane') {
altitude = data.alt_msl;
}The Solution: Standard Fields
GameGlue normalizes all telemetry to standard field names that work across all simulators:
javascript
// With normalization - works with any sim
const altitude = data.altitude;
const airspeed = data.indicated_airspeed;
const heading = data.heading;Available Fields
Position
latitude- Aircraft latitude (degrees)longitude- Aircraft longitude (degrees)altitude- Altitude above sea level (ft)altitude_agl- Altitude above ground (ft)on_ground- Whether aircraft is on ground
Velocity
indicated_airspeed- Indicated airspeed (kts)true_airspeed- True airspeed (kts)ground_speed- Ground speed (kts)vertical_speed- Vertical speed (ft/min)mach- Mach number
Attitude
heading- Magnetic heading (degrees)pitch- Pitch angle (degrees)roll- Bank angle (degrees)
Autopilot
autopilot_master- AP master engagedautopilot_altitude_hold- Altitude hold activeautopilot_heading_hold- Heading hold activeautopilot_altitude_target- Target altitude (ft)autopilot_heading_target- Target heading (degrees)
Controls
gear_down- Landing gear extendedflaps- Flaps position (%)spoilers- Spoilers position (%)parking_brake- Parking brake engaged
Lights
light_landing- Landing lights onlight_taxi- Taxi lights onlight_beacon- Beacon lights onlight_nav- Navigation lights onlight_strobe- Strobe lights on
Commands
Commands also use standard names, so you can control any simulator with the same code:
javascript
// Works with MSFS, X-Plane, or any supported sim
await listener.sendCommand('gear_up');
await listener.sendCommand('autopilot_on');
await listener.sendCommand('set_autopilot_altitude', 35000);Available Commands
| Command | Description |
|---|---|
autopilot_on | Engage autopilot |
autopilot_off | Disengage autopilot |
gear_up | Retract landing gear |
gear_down | Extend landing gear |
flaps_up | Retract flaps one notch |
flaps_down | Extend flaps one notch |
landing_lights_toggle | Toggle landing lights |
set_autopilot_altitude | Set AP altitude (with value) |
set_autopilot_heading | Set AP heading (with value) |
How It Works
- Game sends raw telemetry with game-specific field names
- GameGlue Desktop receives the raw data from the simulator
- Schema mapping converts raw fields to standard names
- Your app receives normalized data via the SDK
MSFS: { heading_gyro: 180 } → Normalization → { heading: 180 }
X-Plane: { hdg_mag: 180 } → Normalization → { heading: 180 }Benefits
- Write once, run anywhere - Your code works with any supported simulator
- Consistent API - Always use the same field names regardless of game
- Type safety - Predictable data structure for TypeScript users
- Future-proof - New simulator support doesn't require code changes
Adding New Simulator Support
When GameGlue adds support for a new simulator, the schema system handles the mapping. Your existing code will work automatically with the new sim.