How Detection of Flight State Works

MSFS Universal Announcer - Automatic Cabin Calls using Fenix format


How Detection of Flight State Works

This is a snapshot of v0.3.3 transitions, so it might evolve. It should answer most questions on ‘what fires when’.

State Transition Table

File to Play Flight State SimVars to Check Timing Logic
BoardingWelcome Ground Pre-boarding GSX Mode: IsOnGround=True AND IsGSXBoardingInProgress=True AND IsBeaconOn=False
Traditional Mode: IsOnGround=True AND IsLogoLightOn=True AND IsBeaconOn=False
Play once when GSX boarding starts OR logo light first turns on, then repeat every X minutes (configurable, default 5) until BoardingComplete
BoardingMusic Boarding Active BoardingWelcome played AND BoardingComplete not played Loop continuously until BoardingComplete or next BoardingWelcome
BoardingComplete Boarding Complete IsBeaconOn=True AND IsOnGround=True OR GSX Boarding complete (when GSX enabled) Play once when beacon first turned on OR GSX boarding completed (whichever happens first)
ArmDoors Departure Preparation IsOnGround=True AND (IsEngineRunning=True OR GroundSpeed > 1) Play once when engines start or aircraft begins moving
PreSafetyBriefing Pre-departure Briefing ArmDoors played AND IsEngineRunning=True Wait for ArmDoors to finish playing
SafetyBriefing Safety Briefing PreSafetyBriefing played Wait for PreSafetyBriefing to finish playing
CabinDimTakeoff Cabin Preparation SafetyBriefing played AND IsDaylight=False Wait for SafetyBriefing to finish playing + 10 seconds
CrewSeatsTakeoff Final Takeoff Prep IsOnGround=True AND (IsLandingLightOn=True OR IsStrobeLightOn=True) AND IsEngineRunning=True When landing lights (default) or strobe lights are turned on (takeoff imminent)
CallCabinSecureTakeoff Takeoff Imminent CrewSeatsTakeoff played AND IsOnGround=True Wait for CrewSeatsTakeoff to finish playing + 5 seconds
AfterTakeoff Post-takeoff AltitudeAGL > TakeoffDetectionAltitudeAGL (3,000 ft) AND IsOnGround=False Wait 2 minutes after takeoff detected (independent timing)
FastenSeatbelt In-flight Seatbelt Reminder Climb/Cruise Phase AND AfterTakeoff played AND Seatbelt Sign OFF→ON transition (CABIN SEATBELTS ALERT SWITCH or ANNUNCIATOR SWITCH binding) 2 Minute Cooldown (Repeatable)
DescentSeatbelts Descent Preparation (AltitudeAGL < DescentDetectionAGL (10,000 ft) AND VerticalSpeed < -500) OR LandingLightJustTurnedOn=True When descending below configurable altitude OR when landing lights just turned on
CrewSeatsLanding Landing Preparation AltitudeAGL < CrewSeatsLandingAGL (3,000 ft) AND VerticalSpeed < -300 AND IsLandingLightOn=True During final approach phase with landing lights on (configurable altitude threshold)
CallCabinSecureLanding Final Landing Prep CrewSeatsLanding played AND AltitudeAGL < CrewSeatsLandingAGL + 2000 (5,000 ft) Wait for CrewSeatsLanding to finish playing + 10 seconds (uses CrewSeatsLandingAGL + 2000ft)
AfterLanding Post-landing IsOnGround=True AND (SpoilersDeployed=False OR GroundSpeed < 15) AND (previous phase was descent/approach OR descent announcements played) After landing and spoilers retracted OR ground speed below 15 knots
DisarmDoors Arrival at Gate AreEnginesOff=True AND IsParkingBrakeOn=True AND AfterLanding played Wait for AfterLanding to finish playing
DisembarkStarted Disembarkation DisarmDoors played AND (IsBeaconOn=False OR IsGSXDeboardingInProgress=True) Wait for DisarmDoors to finish playing

GSX Integration

The Universal Announcer now supports GSX (Ground Services eXtended) integration for more realistic boarding announcements. This feature must be enabled in the Settings → Integrations tab.

GSX SimVar Integration

When GSX integration is enabled, the system monitors three GSX simvars:

GSX Boarding State - L:FSDT_GSX_BOARDING_STATE:

  • State 1: Service can be called
  • State 2: Service is not available
  • State 3: Service has been bypassed
  • State 4: Service has been requested
  • State 5: Service is being performed ⭐ ACTIVE BOARDING
  • State 6: Service has been completed ⭐ BOARDING COMPLETE

GSX Refueling State - L:FSDT_GSX_REFUELING_STATE:

  • State 1: Service can be called
  • State 2: Service is not available
  • State 3: Service has been bypassed
  • State 4: Service has been requested ⭐ REFUELING REQUESTED
  • State 5: Service is being performed ⭐ ACTIVE REFUELING
  • State 6: Service has been completed

GSX Deboarding State - L:FSDT_GSX_DEBOARDING_STATE:

  • State 1: Service can be called
  • State 2: Service is not available
  • State 3: Service has been bypassed
  • State 4: Service has been requested ⭐ DEBOARDING REQUESTED
  • State 5: Service is being performed ⭐ ACTIVE DEBOARDING
  • State 6: Service has been completed

GSX Boarding Logic

When GSX integration is enabled:

  • BoardingWelcome is triggered when L:FSDT_GSX_BOARDING_STATE = 5 (service being performed)
  • BoardingComplete is triggered when either:
    • Beacon light turns on (traditional trigger)
    • L:FSDT_GSX_BOARDING_STATE = 6 (service completed)
    • Whichever happens first provides the most realistic timing
  • Automatic Fallback: If GSX is not available (not installed or not running), the system automatically falls back to logo light trigger
  • Smart Detection: Uses IsGSXAvailable to determine if GSX data is actually being received
  • Refueling variants: When L:FSDT_GSX_REFUELING_STATE = 4 or 5 (requested or being performed), sound files with [Refueling] tags are preferred over standard variants
  • Deboarding trigger: When L:FSDT_GSX_DEBOARDING_STATE = 4 or 5 (requested or being performed), DisembarkStarted announcement is triggered (supplements beacon light off trigger)
  • Provides more realistic timing aligned with actual ground service operations

When GSX integration is disabled:

  • Traditional logo light trigger is used (IsLogoLightOn=True)
  • [Refueling] sound variants are not selected
  • Behavior remains unchanged from previous versions
  • No dependency on GSX being installed or active

Manual Flight State Override Menu

The Universal Announcer provides a comprehensive manual flight state override system accessible via the system tray menu. This allows users to jump to any flight phase and get appropriate announcements for that stage of flight.

Right-click the system tray icon → Flight State submenu

Control Options

Menu Option Description State Set
Resume Resume all announcements (only shown when stopped) Resumes automatic detection
Stop Stop all announcements (only shown when running) Pauses all announcements
Auto Return to automatic flight state detection null (automatic detection)
Restart Reset state machine to beginning of flight sequence Clears all played announcements

Flight Phase Options

Menu Option Flight State Announcements Marked as Played What You’ll Get Next
Preflight Preflight None BoardingWelcome when logo light turns on
Taxi Taxi BoardingWelcome, BoardingMusic, BoardingComplete ArmDoors when engines start or aircraft moves
Takeoff Takeoff BoardingWelcome, BoardingMusic, BoardingComplete, ArmDoors, PreSafetyBriefing, SafetyBriefing, CabinDimTakeoff CrewSeatsTakeoff when landing/strobe lights turn on
Climb Climb BoardingWelcome, BoardingMusic, BoardingComplete, ArmDoors, PreSafetyBriefing, SafetyBriefing, CabinDimTakeoff, CrewSeatsTakeoff, CallCabinSecureTakeoff AfterTakeoff after 2 minutes at altitude > TakeoffDetectionAltitudeAGL (3,000 ft)
Cruise Cruise All pre-cruise announcements (boarding through AfterTakeoff) FastenSeatbelt when seatbelt sign turns on, DescentSeatbelts when descending
Descent Descent All pre-descent announcements (boarding through AfterTakeoff) DescentSeatbelts when below DescentDetectionAGL (10,000 ft) OR when landing lights just turned on
Approach Approach All pre-approach announcements (boarding through AfterTakeoff) CrewSeatsLanding when below CrewSeatsLandingAGL (3,000 ft) with landing lights
Landing Landing All pre-landing announcements (boarding through CallCabinSecureLanding) AfterLanding when on ground with spoilers retracted
Done Done All announcements No further announcements (flight complete)