Not Zibo's: Zibo reads X-Plane's radios. MSFS's NAV receiver gives a clean, ideal beam, so the systems module adds
what a real 737's receivers show (wasm/src/core/nav/ils_receiver.h). On by default;
L:LU737_ILS_REALISM_OFF = 1 gives MSFS's clean signal as before (docs/OPTIONS.md).
One receiver model per VHF NAV / MMR, and everything reads it: zibomod's AFDS (APP, VOR LOC, G/S), Zibo's FMS
scripts (sim/cockpit2/radios/indicators/navN_*), and the PFD / ND (L:LU737_NAVn_HDEF, _VDEF, _LOC_VALID,
_GS_VALID, _DME, _DME_VALID). So the needles you see are the ones the autopilot flies.
What it does#
| False glideslopes | A null-reference glideslope's signal against the elevation angle is about a sine. Besides the 3° path it crosses zero at 6° (reversed sense: above it the needle says fly up) and at 9° (normal sense: a path the autopilot can capture). Below 1.5° fully fly-up. One dot per 0.28° at the path, as MSFS's needle. |
| Beyond the service volume | Localizer clean to 25 nm within 12° of the course, 20 nm within 35°, 10 nm beyond; glideslope clean to 12 nm within 8°, none beyond 16°. Past that the needles wander and jump more and more (smoothed noise, up to about 1.2–1.4 dots), the flags flicker, then the signal is gone (localizer about 14 nm past its limit, glideslope beyond 25 nm). Inside the volume: no noise. |
| Beam bends | Small slow course / path wanderings along the approach (sines of 1.5–5 nm), up to 0.04 dot (localizer) / 0.06 dot (glideslope) far out, about 0.01 near the runway; each ILS (frequency) its own. A needle against its stop stays there (zibomod reads a needle leaving the stop as the beam coming alive). |
| Back course | Behind the localizer: the same side of the course line gives the same needle, so flying the back course inbound with the front course set reads reversed; no glideslope there. |
| DME | 2–4 s to lock on after a frequency change or a loss of more than 8 s; through a shorter loss the last distance is held (memory). |
Where the geometry comes from#
MSFS's receiver for the tuned ILS: NAV GLIDE SLOPE ERROR (degrees, ±10, not clamped like NAV GSI), NAV RAW GLIDE SLOPE, NAV GLIDE SLOPE LENGTH, NAV RADIAL ERROR, NAV DME. Their signs are not documented, so the receiver
learns each against NAV GSI / NAV CDI (FSUIPC: GSI positive with the aircraft above the path; CDI positive with
the course to the right) once it has seen 10 consistent samples. Until then the false glideslopes and the back
course are not applied (MSFS's clean shapes). Readouts: L:LU737_NAVn_GS_SIGN, _LOC_SIGN (0 not yet, ±1), and
L:LU737_NAVn_GS_THETA (the elevation angle seen). If in the sim the G/S needle looks reversed far above the path
from the start, or _GS_SIGN stays 0 on an approach, tell me these values.
Tests#
ils_receiver_*(wasm/test/test_ils_receiver.cpp): the false paths' zeros and senses, both learned signs; the noise and flags by distance and azimuth (8 nm: none; glideslope at 20 nm: σ about 1 dot, flag 26 % of the time; gone at 26 nm; localizer at 33 nm noisy, gone at 40); bends; a pegged needle stays pegged; the back course; the DME's lock-on (2–4 s), memory and relock; off = MSFS's values.afds_false_glideslope_capture(wasm/test/test_afds_capture.cpp): level at 3000 ft on the localizer 6 nm out, APP armed. With the realism the G/S captures at 5.9° (the reversed false path: the needle then says fly up, the A/P holds level); passing 9° the needle swings through the normal false path and the A/P pitches down. Without it MSFS's needle stays pegged and nothing is captured.afds_ils_far_out_signal: 18 nm on the path, the G/S needle's σ 0.64 dot, the flag in view 4 % of the time; the localizer (20 nm, in its sector) clean.afds_ils_approach_and_autoland,afds_loc_intercept_and_track: unchanged results with the realism on (LOC within 0.06°, G/S within 0.01°, autoland); the servo tuning test runs on a straight beam (realism off) plus a realism run (within 0.09° of the straight line: the aircraft follows the bends).