Technical reference

MSFS facility data: what the navdata crawler requests

docs/MSFS_FACILITY_DATA.md

The facts the navdata provider (docs/M5C_NAVDATA.md) relies on: SimConnect facility data field names, their binary layout and units. MSFS's SDK documentation site is not reachable from the build environment; these are taken from the SDK header (third_party/msfs2024-sdk/SimConnect/SimConnect.h: list / request functions, minimal list records) and cross-checked with an open-source SimConnect facility loader (Little Navmap's atools, src/fs/sc/db/simconnectloader.cpp, simconnectairport.h, simconnectnav.h, which loads MSFS 2024's whole navdata this way). Facts only; no code is taken from it. Anything here the sim contradicts shows up as a SimConnect exception (L:LU737_SIMCONNECT_EXCEPTION, console).

Requests#

  • SimConnect_RequestAllFacilities(type): AIRPORT, WAYPOINT, NDB, VOR, the whole world, answered as SIMCONNECT_RECV_FACILITY_MINIMAL_LIST (dwEntryNumber / dwOutOf parts): SIMCONNECT_ICAO (Type char, Ident[9], Region[3], Airport[5]) and SIMCONNECT_DATA_LATLONALT.
  • SimConnect_AddToFacilityDefinition(def, field) builds a definition: "OPEN <ENTRY>", fields, "CLOSE <ENTRY>", children nested the same way. SimConnect_RequestFacilityData_EX1(def, req, ident, region, type) answers one SIMCONNECT_RECV_FACILITY_DATA per entry / child item (Type = SIMCONNECT_FACILITY_DATA_*, IsListItem, ItemIndex, ListSize, UniqueRequestId, ParentUniqueRequestId), then SIMCONNECT_RECV_FACILITY_DATA_END. The data is the fields in request order, packed (no padding).

Layouts (field: type)#

Entry Fields in the order requested
WAYPOINT LATITUDE f64, LONGITUDE f64, TYPE i32, ICAO char[8], REGION char[8]
ROUTE (child of WAYPOINT) NAME char[32], TYPE i32, NEXT_ICAO char[8], NEXT_REGION char[8], NEXT_TYPE i32, NEXT_ALTITUDE f32, PREV_ICAO char[8], PREV_REGION char[8], PREV_TYPE i32, PREV_ALTITUDE f32
NDB LATITUDE f64, LONGITUDE f64, ALTITUDE f64, FREQUENCY u32 (Hz), TYPE i32, RANGE f32, ICAO char[8], REGION char[8], NAME char[64]
VOR (also ILS / LOC) VOR_LATITUDE, VOR_LONGITUDE, VOR_ALTITUDE, DME_LATITUDE, DME_LONGITUDE, DME_ALTITUDE, GS_LATITUDE, GS_LONGITUDE, GS_ALTITUDE f64; IS_NAV, IS_DME, IS_TACAN, HAS_GLIDE_SLOPE, DME_AT_NAV, DME_AT_GLIDE_SLOPE, HAS_BACK_COURSE i32; FREQUENCY u32 (Hz); TYPE i32; NAV_RANGE f32; MAGVAR f32; ICAO char[8]; REGION char[8]; LOCALIZER f32 (magnetic course); LOCALIZER_WIDTH f32; GLIDE_SLOPE f32 (degrees); NAME char[64]; LS_CATEGORY i32
AIRPORT ICAO char[8], REGION char[8], LATITUDE f64, LONGITUDE f64, ALTITUDE f64 (m), NAME64 char[64], TOWER_LATITUDE / _LONGITUDE / _ALTITUDE f64, TRANSITION_ALTITUDE f32 (m), TRANSITION_LEVEL f32 (m); N_RUNWAYS, N_APPROACHES, N_DEPARTURES, N_ARRIVALS i32
RUNWAY (child of AIRPORT) LATITUDE, LONGITUDE, ALTITUDE f64 (centre); HEADING f32 (true); LENGTH, WIDTH f32 (m); PATTERN_ALTITUDE f32; SURFACE i32; PRIMARY_NUMBER, PRIMARY_DESIGNATOR i32; PRIMARY_ILS_ICAO, PRIMARY_ILS_REGION char[8]; PRIMARY_ILS_TYPE i32; SECONDARY_ the same
APPROACH TYPE, SUFFIX, RUNWAY_NUMBER, RUNWAY_DESIGNATOR i32; FAF_ICAO, FAF_REGION char[8]; FAF_ALTITUDE f32; FAF_TYPE i32; MISSED_ALTITUDE f32; IS_RNPAR i32; children FINAL_APPROACH_LEG, MISSED_APPROACH_LEG, APPROACH_TRANSITION (TYPE i32, IAF_ICAO, IAF_REGION char[8], IAF_TYPE i32, IAF_ALTITUDE f32, DME_ARC_ICAO, DME_ARC_REGION char[8], DME_ARC_TYPE, DME_ARC_RADIAL i32, DME_ARC_DISTANCE f32; child APPROACH_LEG)
DEPARTURE / ARRIVAL NAME char[8]; children APPROACH_LEG (the common route), RUNWAY_TRANSITION (RUNWAY_NUMBER, RUNWAY_DESIGNATOR i32; APPROACH_LEG), ENROUTE_TRANSITION (NAME char[8]; APPROACH_LEG)
legs (APPROACH_LEG, FINAL_APPROACH_LEG, MISSED_APPROACH_LEG) TYPE i32; FIX_ICAO, FIX_REGION char[8]; FIX_TYPE i32; FLY_OVER, DISTANCE_MINUTE, TRUE_DEGREE, TURN_DIRECTION i32; ORIGIN_ICAO, ORIGIN_REGION char[8]; ORIGIN_TYPE i32; THETA, RHO, COURSE, ROUTE_DISTANCE f32; APPROACH_ALT_DESC i32; ALTITUDE1, ALTITUDE2, SPEED_LIMIT, VERTICAL_ANGLE f32; ARC_CENTER_FIX_ICAO, ARC_CENTER_FIX_REGION char[8]; ARC_CENTER_FIX_TYPE i32; RADIUS f32; IS_IAF, IS_IF, IS_FAF, IS_MAP i32; REQUIRED_NAVIGATION_PERFORMANCE f32

Values#

  • Frequencies in Hz: VOR / ILS 116800000 (X-Plane's 10 kHz unit: / 10000), NDB 362000 (kHz: / 1000).
  • VOR MAGVAR: 0–360, values above 180 are negative (east positive after that); the localizer's true course = LOCALIZER + magnetic variation.
  • A VOR facility is a localizer when LOCALIZER_WIDTH > 0 (its TYPE is not reliable). LS_CATEGORY: 1–3 ILS CAT I–III, 4 localizer, 5 IGS, 6 LDA, 7 LDA with GS, 8 SDF, 9 SDF with GS. The localizer's runway: the airport runway end whose PRIMARY_ILS_ICAO / SECONDARY_ILS_ICAO names it. NAV_RANGE and altitudes in metres.
  • VOR kinds: IS_NAV + IS_DME (or IS_TACAN) VOR-DME / VORTAC, IS_NAV alone VOR, IS_DME / IS_TACAN alone DME / TACAN.
  • Airport TRANSITION_ALTITUDE / _LEVEL in metres.
  • Runway designator: 0 none, 1 L, 2 R, 3 C, 4 water, 5 A, 6 B. Runway number 1–36 (higher: compass points).
  • Leg TYPE (ARINC 424 path terminator): 1 AF, 2 CA, 3 CD, 4 CF, 5 CI, 6 CR, 7 DF, 8 FA, 9 FC, 10 FD, 11 FM, 12 HA, 13 HF, 14 HM, 15 IF, 16 PI, 17 RF, 18 TF, 19 VA, 20 VD, 21 VI, 22 VM, 23 VR.
  • FIX_TYPE / *_TYPE of a fix: the ICAO type character ('A' airport, 'W' waypoint, 'V' VOR, 'N' NDB, 'R' runway).
  • APPROACH_ALT_DESC: 0 none, 1 at (A), 2 at or above (+), 3 at or below (-), 4 between (B).
  • TURN_DIRECTION: 0 none, 1 left, 2 right, 3 either.
  • Approach TYPE: 1 GPS, 2 VOR, 3 NDB, 4 ILS, 5 LOC, 6 SDF, 7 LDA, 8 VOR/DME, 9 NDB/DME, 10 RNAV, 11 LOC back course.