VFR Traffic

v0.19 brings general aviation alongside the airline traffic (epic #431): light aircraft flying circuits and VFR arrivals and departures through reporting points, with the tower’s VFR calls. This page grows with the version; what is here is in place.

Light aircraft (#565)

ProfileFor knows five light singles, matched in the model title as the simulator’s AI models name them (Asobo PassiveAircraft C152, C172, DA40 NG, SR22), and the PA-28:

Type Span Length Approach Climb Flaps (take-off, approach, landing)
C152 10.16 m 7.34 m 56 kt 715 fpm 10°, 20°, 30°
C172 11.00 m 8.28 m 61 kt 721 fpm 10°, 20°, 30°
P28A (PA-28) 9.14 m 7.10 m 61 kt 660 fpm 0°, 25°, 40°
DA40 11.9 m 8.1 m 64 kt 1120 fpm T/O, T/O, LDG
SR22 11.68 m 7.92 m 78 kt 1270 fpm 50 %, 50 %, 100 %

Span, length and rate of climb are the published figures (Wikipedia’s specifications: C152, C172R, PA-28-140, DA40 XL, SR22-G5). The approach speed is 1.3 times the published flaps-down stall speed. Wheelbase, CG height, take-off distance and the rotation and climb speeds are estimates; the simulator’s SimVars refine the airframe in flight (Refine). They are light for wake (ICAO L, RECAT-EU F) and single-engined (EngineCount 1). An unknown aircraft below 15 m span is taken for a light single (GenericProfile).

Circuits (#567)

NewCircuit(layout, "24", CircuitConfig{}, profile) is a runway end’s circuit for one aircraft: upwind, crosswind, downwind (its point abeam the threshold), base, final and the runway, each with its altitude and speed. Waypoints(leg) gives them from a leg on as MSFS AI waypoints, the corners rounded to the aircraft’s turns.

Every airport, and every runway end, can have its own circuit (CircuitConfig). Anything left at zero takes a default:

Setting Default
Side left-hand (CircuitRight for a right-hand circuit)
HeightFt 1000 ft above the airfield (CircuitHeightFt)
DownwindNM two standard-rate turn radii at the circuit speed, at least 0.8 NM (CircuitMinDownwindNM): about 1 NM for a C172
UpwindNM 0.5 NM past the departure end, then crosswind (CircuitUpwindNM)
BaseNM 1 NM before the threshold, then final (CircuitBaseNM)

The circuit speed is 1.25 times the approach speed (CircuitSpeedFactor, an estimate: about 75 kt for a C172). The upwind climbs to two thirds of the circuit height before the crosswind turn. The base starts down, and the final follows a 3° path (CircuitGlideFtPerNM).

JoinDownwind() is the 45° entry: a point a mile out from midfield on the downwind, outside the circuit and towards its upwind end. Flown to midfield, it meets the downwind at 45°; a left-hand circuit is joined with a right turn. From(LegDownwind) goes on from there.

Reporting points (#566)

VFR arrivals and departures use the airport’s reporting points. A live probe at LKPR found none of the simulator’s waypoints typed VFR (WAYPOINT TYPE 9) within 30 km. Seven named waypoints have VP-prefixed idents, possibly coded visual points, but without names. The reporting points are therefore set per airport, with those waypoints offered as candidates.

Circuit arrivals (#568)

ArrivalRequest.Circuit (with InjectApproach, instead of a STAR in Procedure) is a VFR arrival through the circuit. PlanCircuitArrival plans it:

  1. It appears at the 45° entry at circuit height and speed.
  2. MSFS AI flies it to midfield on the downwind, abeam the threshold, to the base turn and onto the final.
  3. The injected approach takes over at the final’s point (BaseNM out) and lands it.

An airliner’s injected approach takes over at least 2 NM out. For a circuit the plan lets it take over from 0.5 NM out (ArrivalProcedure.MinJoinMeters).

On the airport map: New flight → Arrival → Options → VFR: join the circuit. The circuit is the runway end’s as set for the airport: GET /api/circuits?icao=LKPR shows it, and POST /api/circuits?icao=LKPR&runway=24 with a CircuitConfig sets it ({} resets). The settings are kept in circuits.json in the user cache folder.

The radio follows Doc 4444 12.3.4.13–17 (Phraseology):

  • The pilot calls the tower “for landing”, with the type, the position from the field, the altitude and the information.
  • The tower answers “join left downwind runway 24” with the wind and QNH.
  • The pilot reports “downwind” abeam the threshold.

In the landing sequence (#569)

A VFR arrival in the circuit is sequenced with the IFR arrivals to the same runway. When it reports downwind, the tower gives its place (Doc 4444 12.3.4.14 b, FollowTraffic): “OKABC, number 2, follow the Airbus A320 on 4 mile final”, or “on short final”, or “in the circuit” when it follows another circuit aircraft; “number 1” alone when it lands first. When the sequence asks it to lose time, the tower extends its downwind (CircuitInstruction, “extend downwind”, 12.3.4.15 c). AbsorbDelay puts all of the delay into a longer downwind for a circuit arrival, with the base turn and final further out, and gives it no speed instruction and no hold. At LKPR a C172 asked to lose a minute on the 24 circuit has its base turn moved out by 0.7 NM.

VFR departures

Circuit.Departure(exitBearing) is the way out of the circuit towards an exit point VFRExitNM (5 NM) from the field, VFRExitAboveFt (1,000 ft) above circuit height. It leaves the circuit by the side the exit is on:

  • ahead (within 45° of the runway heading): straight out from the upwind;
  • to the circuit’s side: by its crosswind leg;
  • to the other side: turning away from the circuit after the upwind;
  • behind: by the crosswind and downwind on the circuit’s side, or by their mirror on the other side. It never crosses the circuit.

With TaxiRequest.VFR the injected take-off hands over to MSFS AI at VFRHandoverFt (400 ft), so MSFS AI flies the turns. VFRDepartureWaypoints gives it the points at their altitude and the circuit speed. On the airport map the New flight option VFR through the circuit works for departures too: the exit is in a random direction (SpawnRequest.ExitBearing sets it) and the route is shown as “VFR north”. A VFR departure gets no departure clearance: its first call is to ground, for start-up or taxi.

Scheduled VFR flights

VFRFlights(VFROptions, from, to) adds light aircraft flying in to the focus airports through the circuit, and as many flying out of them, VFRPerHour (1) an hour by default, scaled by the density. Each flight has Rules “VFR”, no origin, a light type (VFRTypes: C172, P28A, C152, DA40, SR22 by weight) and as call sign a registration of the airport’s country (VFRRegistration: OKABC at LKPR, DEABC in Germany, GABCD in the UK).

  • They fly by day only. It must be day (Daylight: the sun no lower than 6° below the horizon, civil twilight, SunElevation) from when the flight appears until a quarter of an hour after its STA. At LKPR on 2 October the first lands at 06:55 local and the last at 18:40.
  • They fly in visual conditions only (VFROptions.Visual). The airport map asks for a visibility of 5 km and a ceiling of 1,500 ft or better at the user’s aircraft. It checks again at the spawn, and a flight waits while the weather is worse.
  • The manager has a VFR flight appear ManagerOptions.VFRLead (8 min) before its STA, near the airport, never en route.
  • On the map it joins the circuit as a circuit arrival (no flight plan, no STAR) and parks on a GA ramp where the airport has one free, else on any stand that fits.

Not yet:

  • A go-around from the circuit still flies the IFR go-around circuit.
  • Touch-and-goes are still to come.
  • Orbits, “make another circuit” and touch-and-goes are still to come (#569).

Jetbridges (#572)

Jetbridges for our traffic are blocked by the simulator.

  • RequestJetwayData lists an airport’s jetways: 27 at LKPR. Each is a SimObject with a status and the aircraft attached, and its parking index is the layout’s stand index.
  • TOGGLE_JETWAY sent to one of our aircraft parked at a jetway stand did nothing.
  • Our traffic is created as NonATC aircraft, the only kind whose stand we can choose. A devsupport thread (March 2026) reports that only ParkedATC and EnrouteATC aircraft use jetways.
  • pkg/types.SIMCONNECT_JETWAY_DATA does not match the packed 160-byte wire entry, so a list must be decoded field by field.