The autopilot state dataref summarizes all state and mode information from the autopilot.
The following table summarizes all bit-field values.
|Bit field (Decimal)||Bit field (Hex)||Name||Axis||Notes|
|2||00002||Heading Hold Engage||Lateral|
|4||00004||Wing Leveler Engage||Lateral|
|8||00008||Airspeed Hold With Pitch Engage||Vertical|
|16||00010||VVI Climb Engage||Vertical|
|32||00020||Altitude Hold Arm||Vertical||Before X-Plane 8.11, altitude was “always armed” – that is, setting this would engage altitude immediately. In X-Plane 9.0, altitude was always armed. In 9.20 and 9.30, this was incorrectly mapped to “altitude engage” when written to.|
|64||00040||Flight Level Change Engage||Vertical|
|128||00080||Pitch Sync Engage||Vertical|
|512||00200||HNAV Engaged||Lateral||Writable with overwrite – see below.|
|2048||00800||Glideslope Engaged||Vertical||Writable with overwrite – see below.|
|New in X-Plane 8.11|
|4096||01000||FMS Armed||FMS||Before X-Plane 8.11 FMS mode was the same as glide-slope mode.|
|8192||02000||FMS Enaged||FMS||(In X-Plane 9, FMS does not have a separate arm and engage – use the “arm” choice.)|
|16384||04000||Altitude Hold Engaged||Vertical||Starting with X-Plane 9.40, you can directly engage the autopilot. See below.|
|New in X-Plane 9.30|
|32768||08000||Horizontal TOGA Engaged||Lateral|
|65536||10000||Vertical TOGA Engaged||Vertical|
|New in X-Plane 9.40|
|262144||40000||VNAV Engaged||Vertical||Writable with overwrite – see below.|
The above table lists various “axes”. Basically the internal autopilot can be in only one mode per axis. Those modes are:
- Lateral – this mode controls the heading of the airplane.
- Vertical – this mode controls the pitch of the airplane. Note that speed-via pitch is a vertical mode, because the plane’s vertical path will change as necessary to hit a target airspeed.
- Autothrottle – this mode controls how the AP interacts with throttles – currently it is effectively boolean (autothrottle is “on” and will try to maintain target airspeed via thrusrt, or it is “off”).
- FMS – the FMS mode is a hack: basically the FMS mode tells whether the FMS will copy current FMS target altitudes into the autopilot windows. No real-world airplane works like this, but X-Plane has had this ability as a poor-man’s way to fly a flight plan since X-Plane 6.
Note that back-course is not an axis – use the dataref sim/cockpit/autopilot2/backcourse_on or the command sim/autopilot/back_course.
Starting in X-plane 740, this dataref can be written.
To change a dataref value, follow these rules:
- Write ONLY the bit you want to toggle! If you want to toggle altitude hold arm, write only “32” to the dataref.
- If you want to change modes in a certain sequence, write to the dataref multiple times. If you write a combined set of bits, the order that the commands are “executed” may not be predictable. For example, engaging heading mode normally clears localizer arm. So to set up for an approach, you want to first set only heading mode, then set only localizer arm. Otherwise, when setting both, there is a chance that the implementation could arm the localizer first, then set heading mode, which would clear the localizer arm.
- Some modes will cancel other modes automatically. In particular, the sim must maintain exactly one lateral and vertical mode. So for example, engaging heading mode will clear out any of: wing leveler, HNAV. So in order to sanely write to the autopilot, you need to understand the “operational” meaning of each change, not just what lights you want to light up. (See below on overrides for more info.)
If you are not using overrides to completely replace the AP logic, you can accomplish the same effect as any bit-set by using the command system – see XPLMUtilities for more info. We strongly recommend all 2.0 plugins use the command system for maximum compatibility. If you are trying to simulate the pilot pressing a button, use the command system!
Starting in X-Plane 940, it is possible to set the “engage” bits directly – see Overriding the Autopilot Mode below.
Some autopilot modes can be “armed”. In armed mode, when the AP mode changes are not overridden (see below) the AP will remain in its old mode, but will be “armed” – that is, listening for a chance to change modes later.
The most typical example is the localizer. When you arm HNAV mode to join a localizer, your lateral mode does not change. (That is, you are still flying via wing leveler or heading.) At a later time, when the localizer signal becomes available to the nav receiver that the AP is listening to, the AP will automatically engage HNAV mode, which naturally replaces the old lateral mode.
Arming state is not a mode on an axis, so arming is not mutually exclusive with other AP functions. You can arm everything at once if you want. Arming is permission for X-Plane to change modes later under certain conditions.
- Altitude hold arm will engage altitude hold when the plane reaches the target altitude dialed into the AP dash.
- HNAV arm will engage when the AP crosses the lateral path we are going to follow (a localizer, GPS course line, etc).
- Glideslope arm will engage when we cross the glide slope from below with signal.
- VNAV arm will engage when the AP crosses the vertical path we are going to follow (e.g. a GPS vertical approach).
Arm Vs. Engage For Altitude Hold
Unlike most other “arm” functions, it is actually possible to either arm or directly engage altitude hold mode, via two different commands (or bits in this dataref). Here is the difference in their operation:
- Altitude hold engage: when altitude hold is engaged and we are not currently in altitude hold mode the autopilot will automatically stop climbing/descending and set the altitude-to-hold to the current altitude. Think of this as a “stop now” button.
- A plane-maker setting will cause X-Plane to optionally reset the altitude hold window on the AP dash to the current altitude.
- Altitude hold arm: this simply arms altitude hold but does not engage altitude hold mode. The current altitude in the AP dashboard window is not changed.
- Plane-Maker has an option to always engage pitch-hold mode when altitude arm is commanded.
- Plane-Maker has an option to re-arm altitude hold mode in a wide variety of situations. Real G1000 planes are like this: you can’t turn off altitude arm unless you are on a glide slope or GPS vertical approach. This can be thought of as a safety feature: because alt-hold is always armed, the airplane can never climb or descend in an unbounded manner – there is always a set “stop point”.
FMS mode is a legacy “mode” that copies FMS entries into the AP windows. See above; it is unrealistic, not found in real aircraft, and exists mainly for legacy compatibility.
VNAV mode is a true vertical planning mode, as found in a G1000 or FMS. However, it is not currently possible to set up and fly VNAV paths with the consumer-level sim. VNAV is only supported in conjunction with the G1000 compatibility option. (In this case a real G1000 provides vertical navigation.)
Starting with X-Plane 860, speed via pitch (vertical speed more) and flight level change are no longer the same dataref. There is only one mode (“speed” mode) and the flight level change bits are aliased for compatibility. For the rest of this paragraph, we will refer to speed via pitch mode as “FLCHG” mode.
FLCHG mode interacts with the auto-throttle in the following ways:
- When FLCHG is engaged, if the autothrottle is enabled, power is increased to 100% throttle (climb) or 0% throttle (descent). This is a throttle position – FLCHG does not target an N1 or other engine output metric. Autothrottle is disabled.
- When altitude arm moves to engage, if FLCHG had been engaged, the autothrottle was disabled for the FLCHG mode, the autothrottle is resumed.
You can use the dataref sim/operation/override/override_autopilot to disable X-Plane’s ability to spontaneously change autopilot modes.
When the override is set, the sim will still change AP modes in response to plugins and user-induced commands. However, the sim will not change modes automatically in response to reaching target altitudes, arm states, etc. These must be done manually by your plugin.
Additionally, starting in X-Plane 940, if this override is set, you can write the following engage modes directly into X-Plane:
- 512 (engage HNAV mode)
- 2048 (engage glide slope mode)
- 262144 (engage VNAV mode)
Note that engaging a mode when the sim is not ready for this mode (e.g. engaging the glide slope when there is no signal) will have unpredictable consequences.
In X-Plane 940 you can override the heading the airplane flies in “NAV” mode with sim/operation/override/override_nav_heading
When this override is set you can:
- Write to sim/cockpit/autopilot/nav_steer_deg_mag to control which way the plane flies.
- Write “512” (engage HNAV) directly into the AP state. NAV mode will go from ARM to engage immediately to fly your heading.
IMPORTANT: There is a “gotcha” about overriding only the AP nav heading: when the autopilot mode is not overridden (see above) then the sim will automatically change from “hnav engaged” to “wing leveler” when there is no signal on the current receiver as selected by the CDI.
So if you are trying to override HNAV to fly a heading while the CDI is selecting NAV1 or NAV2 radios, and those radios have no signal, your write of “512” to engage HNAV will immediately be counteracted by X-plane, which will disengage HNAV completely due to no signal.
The solution is to override both the autopilot nav heading AND the entire autopilot mode states.
Writing to this dataref works by issuing a sim command in most cases.
This means that if you write this dataref from a command-handler that is overriding an autopilot command, there is a good chance that you will put the sim into an infinite loop, like this.
- User presses AP button.
- Panel code issues AP command.
- Plugin receives “first chance” at the command.
- Plugin writes to autopilot_state dataref.
- Dataref write handler issues an AP command. (Go back to step 3.)
To avoid infinite loops:
- Trigger commands when possible, rather than writing this dataref. This will at least make it clear when there is an infinite loop risk.
- To re-trigger the “default behavior” (e.g. user hits “hdg”, you change data, then you want X-Plane to really arm hdg) simply use the return value from the command handler to indicate that x-plane should receive. See XPLMUtilities for the command API.
- If you need to cross-call a different AP mode (e.g. user hits “HNAV” but you want to go into “HDG” mode) be sure to set a recursion-check flag if your plugin can recurse back into the original command handler code! The sim will not detect this infinite loop, it will simply hang.
These are the enum mappings for the older datarefs. Please avoid using them whenever possible; they will be discontinued!
sim/cockpit/autopilot/airspeed_mode 9 = discon 10 = autothrottle 13 = airspeed via pitch sim/cockpit/autopilot/heading_mode 9 = discoin 11 = heading mode 12 = wing leveler sim/cockpit/autopilot/altitude_mode 9 = discon 14 = vvi 15 = alt mode arm 16 = alt hold engage 17 = fms arm 18 = fms engage 19 = lca 20 = pitch sync sim/cockpit/autopilot/mode_hnav 9 = discon 21 = loc arm 22 = loc engage sim/cockpit/autopilot/altitude_gls 9 = discon 23 = gls arm 24 = gls engage