aviation

package
v0.14.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 10, 2026 License: GPL-3.0 Imports: 31 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RadioTransmissionUnknown    = iota
	RadioTransmissionContact    // Messages initiated by the pilot
	RadioTransmissionReadback   // Reading back an instruction
	RadioTransmissionUnexpected // Something urgent or unusual
	RadioTransmissionMixUp      // Pilot confused about who was being addressed
	RadioTransmissionNoId       // No callsign included (e.g. to say "blocked")
)
View Source
const (
	RouteBasedFix = "route"
	ZoneBasedFix  = "zone"
)
View Source
const (
	PTUndefined = iota
	PTRacetrack
	PTStandard45
)
View Source
const (
	DirectEntryShortTurn = iota
	DirectEntryLongTurn
	ParallelEntry
	TeardropEntry
)
View Source
const (
	AirwayLevelAll = iota
	AirwayLevelLow
	AirwayLevelHigh
)
View Source
const (
	AirwayDirectionAny = iota
	AirwayDirectionForward
	AirwayDirectionBackward
)
View Source
const ARINC424LineLength = 134 // 132 chars + \r + \n
View Source
const MaxRestrictionAreas = 100

This many adapted and then this many user-defined

Variables

View Source
var (
	ErrBadPoolSpecifier           = errors.New("Bad pool specifier")
	ErrInvalidAltitude            = errors.New("Altitude above aircraft's ceiling")
	ErrInvalidController          = errors.New("Invalid controller")
	ErrInvalidFacility            = errors.New("Invalid facility")
	ErrInvalidHeading             = errors.New("Invalid heading")
	ErrInvalidSquawkCode          = errors.New("Invalid squawk code")
	ErrNoAircraftForCallsign      = errors.New("No aircraft exists with specified callsign")
	ErrNoController               = errors.New("No controller with that callsign")
	ErrNoCoordinationFix          = errors.New("No coordination fix found")
	ErrNoERAMFacility             = errors.New("No ERAM facility exists")
	ErrNoFlightPlan               = errors.New("No flight plan has been filed for aircraft")
	ErrNoMatchingFix              = errors.New("No matching fix")
	ErrNoMoreAvailableSquawkCodes = errors.New("No more available squawk codes")
	ErrNoSTARSFacility            = errors.New("No STARS Facility in ERAM computer")
	ErrNoValidArrivalFound        = errors.New("Unable to find a valid arrival")
	ErrNoValidDepartureFound      = errors.New("Unable to find a valid departure")
	ErrNotBeingHandedOffToMe      = errors.New("Aircraft not being handed off to current controller")
	ErrNotPointedOutByMe          = errors.New("Aircraft not being pointed out by current controller")
	ErrNotPointedOutToMe          = errors.New("Aircraft not being pointed out to current controller")
	ErrOtherControllerHasTrack    = errors.New("Another controller is already tracking the aircraft")
	ErrSquawkCodeAlreadyAssigned  = errors.New("Squawk code has already been assigned")
	ErrSquawkCodeNotManagedByPool = errors.New("Squawk code is not managed by this pool")
	ErrSquawkCodeUnassigned       = errors.New("Squawk code has not been assigned")
	ErrUnknownAirport             = errors.New("Unknown airport")
	ErrUnknownRunway              = errors.New("Unknown runway")
)
View Source
var NATOPhonetic = map[string]string{
	"A": "alpha", "B": "bravo", "C": "charlie", "D": "delta",
	"E": "echo", "F": "foxtrot", "G": "golf", "H": "hotel",
	"I": "india", "J": "juliet", "K": "kilo", "L": "lima",
	"M": "mike", "N": "november", "O": "oscar", "P": "papa",
	"Q": "quebec", "R": "romeo", "S": "sierra", "T": "tango",
	"U": "uniform", "V": "victor", "W": "whiskey", "X": "x-ray",
	"Y": "yankee", "Z": "zulu",
}

NATOPhonetic maps uppercase letters to their standard NATO phonetic alphabet words.

Functions

func AirportHasRunway added in v0.14.1

func AirportHasRunway(airport string, runway RunwayID) bool

AirportHasRunway returns true if the given runway exists at the airport (from DB).

func CWT25nmReductionAllowed added in v0.14.1

func CWT25nmReductionAllowed(frontCWT, backCWT string) bool

CWT25nmReductionAllowed returns true if 2.5nm reduced approach separation is allowed for the given front/back CWT category pair per 7110.65 5-5-4(i): the leading aircraft's weight class must be the same or less than the trailing aircraft, and super/heavy aircraft may only participate as the trailing aircraft.

func CWTApproachSeparation

func CWTApproachSeparation(front, back string) float32

CWTApproachSeparation returns the required separation between aircraft of the two given CWT categories. If 0 is returned, minimum radar separation should be used.

func CWTDirectlyBehindSeparation

func CWTDirectlyBehindSeparation(front, back string) float32

CWTDirectlyBehindSeparation returns the required separation between aircraft of the two given CWT categories. If 0 is returned, minimum radar separation should be used.

func CWTRequiredApproachSeparation added in v0.14.1

func CWTRequiredApproachSeparation(frontCWT, backCWT string, eligible25nm bool) float32

CWTRequiredApproachSeparation returns the required approach separation between aircraft of the given CWT categories, applying the 2.5nm reduction if eligible25nm is true and the weight categories allow it.

func CallsignClashesWithExisting added in v0.14.1

func CallsignClashesWithExisting(currentCallsigns []ADSBCallsign, proposed string, uniqueSuffix bool) bool

func CheckApproaches

func CheckApproaches(e *util.ErrorLogger, wps []WaypointArray, requireFAF bool, controllers map[ControlPosition]*Controller,
	checkScratchpad func(string) bool)

func DensityRatioAtAltitude

func DensityRatioAtAltitude(alt float32) float32

returns the ratio of air density at the given altitude (in feet) to the air density at sea level, subject to assuming the standard atmosphere.

func FormatAltitude

func FormatAltitude(falt float32) string

func FormatScopeAltitude added in v0.13.0

func FormatScopeAltitude[T ~int | ~float32](alt T) string

func GetACTypePronunciations added in v0.14.0

func GetACTypePronunciations(acType string) []string

GetACTypePronunciations returns all pronunciation variants for an aircraft type. For example, "C172" might return ["skyhawk", "cessna one seventy-two"]. Returns nil if the type is not found in sayactype.json.

func GetAirportTelephonyVariants added in v0.14.0

func GetAirportTelephonyVariants(icao string) []string

GetAirportTelephonyVariants returns all spoken name variants for an airport. This is used by STT for matching spoken airport names to ICAO codes. Returns all variants from sayairport.json if available, otherwise returns a slice with just the database name (if available), or nil if not found.

func GetApproachTelephony added in v0.14.0

func GetApproachTelephony(approach string) string

GetApproachTelephony returns the spoken form of an approach name. For example, "RNAV X Runway 22L" becomes "r-nav x-ray runway 2 2 left".

func GetCallsignSpoken added in v0.14.0

func GetCallsignSpoken(callsign string, cwtCategory string) string

GetCallsignSpoken returns the spoken telephony string for a callsign, formatted as it would be pronounced (for Whisper prompts). Example: "JBU520" → "jetblue five 20", "BAW22J" → "speedbird 22 juliet"

func GetFixTelephony added in v0.14.0

func GetFixTelephony(fix string) string

GetFixTelephony returns the spoken name for a fix (navaid, airport, or waypoint). It uses pronunciations from sayfix.json when available, falls back to database lookups for navaids/airports, and uses StopShouting for other fixes.

func GetSIDTelephony added in v0.14.0

func GetSIDTelephony(sid string) string

GetSIDTelephony returns the spoken form of a SID name. For example, "MERIT5" becomes "merit five".

func GetSTARTelephony added in v0.14.0

func GetSTARTelephony(star string) string

GetSTARTelephony returns the spoken form of a STAR name. For example, "CAMRN4" becomes "cameron four".

func GetTelephony added in v0.14.0

func GetTelephony(callsign string, cwtCategory string) string

GetTelephony returns the spoken telephony string for a callsign. cwtCategory determines the heavy/super suffix: "A" = super, "B"/"C"/"D" = heavy.

func GetTrailing3Spoken added in v0.14.0

func GetTrailing3Spoken(callsign string) string

GetTrailing3Spoken returns the trailing 3 characters of a callsign as spoken phonetics. For "N123AB", returns "3 alpha bravo". For callsigns shorter than 3 chars (excluding N prefix), returns the whole number.

func IASToTAS

func IASToTAS(ias, altitude float32) float32

func InAirspace

func InAirspace(p math.Point2LL, alt float32, volumes []ControllerAirspaceVolume) (bool, [][2]int)

func InBravoAirspace

func InBravoAirspace(p math.Point2LL, alt int) bool

func InCharlieAirspace

func InCharlieAirspace(p math.Point2LL, alt int) bool

func InDeltaAirspace

func InDeltaAirspace(p math.Point2LL, alt int) bool

func InitDB

func InitDB()

func IntersectingRunways added in v0.14.0

func IntersectingRunways(airport string, rwy RunwayID, nmPerLongitude, maxDistNM float32) []string

IntersectingRunways returns all runways at airport that physically intersect the given runway. It checks if runway centerlines cross and the intersection point is within maxDistNM of both runway segments (threshold to threshold). Use maxDistNM=0 for strict threshold-to-threshold intersection, or a small value (e.g., 0.5) to account for pavement extending past thresholds. Returns both directions for each intersecting runway (e.g., both "13L" and "31R").

func MachToTAS added in v0.14.1

func MachToTAS(mach float32, temp float32) float32

func OppositeRunwayId added in v0.14.0

func OppositeRunwayId(rwy string) string

OppositeRunwayId returns the runway ID for the opposite end of the given runway. E.g., "13L" -> "31R", "22R" -> "4L", "9" -> "27".

func PrintCIFPRoutes

func PrintCIFPRoutes(airport string) error

func RandomizeRoute

func RandomizeRoute(w []Waypoint, r *rand.Rand, randomizeAltitudeRange bool, perf AircraftPerformance, nmPerLongitude float32,
	magneticVariation float32, airport string, lg *log.Logger)

func RegisterIntentMerger added in v0.14.0

func RegisterIntentMerger(fn any)

RegisterIntentMerger registers a merge function. fn must have signature: func(IntentType1, IntentType2, ...) ([]CommandIntent, bool) where all parameter types implement CommandIntent. Panics if signature is invalid or duplicate type sequence exists.

func SplitCallsign added in v0.14.0

func SplitCallsign(callsign string) (prefix, number string)

SplitCallsign splits a callsign into ICAO prefix and flight number. For "UAL123" returns ("UAL", "123"). For "N12345" returns ("N", "12345").

func SquawkIsSPC

func SquawkIsSPC(squawk Squawk) (ok bool, code string)

func StringIsSPC

func StringIsSPC(code string) bool

func TASToIAS

func TASToIAS(tas, altitude float32) float32

func TASToMach added in v0.14.1

func TASToMach(tas float32, temp float32) float32

func UnderBravoShelf

func UnderBravoShelf(grid *AirspaceGrid, p math.Point2LL, alt int) bool

Types

type ADSBCallsign

type ADSBCallsign string

func (ADSBCallsign) String

func (c ADSBCallsign) String() string

type ARINC424Result added in v0.13.0

type ARINC424Result struct {
	Airports      map[string]FAAAirport
	Navaids       map[string]Navaid
	Fixes         map[string]Fix
	Airways       map[string][]Airway
	EnrouteHolds  map[string][]Hold
	TerminalHolds map[string]map[string][]Hold
}

func ParseARINC424

func ParseARINC424(r io.Reader) ARINC424Result

type ARTCC

type ARTCC = Facility

ARTCC is a type alias for Facility representing an Air Route Traffic Control Center.

type ATCT added in v0.14.1

type ATCT TRACON

type ATISIntent added in v0.14.1

type ATISIntent struct {
	Letter string
}

ATISIntent represents the pilot's acknowledgment of the ATIS letter.

func (ATISIntent) Render added in v0.14.1

func (a ATISIntent) Render(rt *RadioTransmission, r *rand.Rand)

type ATPAVolume

type ATPAVolume struct {
	Id                  string `json:"id"`
	ThresholdString     string `json:"runway_threshold"`
	Threshold           math.Point2LL
	Heading             float32  `json:"heading"`
	MaxHeadingDeviation float32  `json:"max_heading_deviation"`
	Floor               float32  `json:"floor"`
	Ceiling             float32  `json:"ceiling"`
	Length              float32  `json:"length"`
	LeftWidth           float32  `json:"left_width"`
	RightWidth          float32  `json:"right_width"`
	FilteredScratchpads []string `json:"filtered_scratchpads"`
	ExcludedScratchpads []string `json:"excluded_scratchpads"`
	Enable25nmApproach  bool     `json:"enable_2.5nm"`
	Dist25nmApproach    float32  `json:"2.5nm_distance"`
}

func (*ATPAVolume) GetRect

func (a *ATPAVolume) GetRect(nmPerLongitude, magneticVariation float32) [4]math.Point2LL

func (*ATPAVolume) Inside

func (a *ATPAVolume) Inside(p math.Point2LL, alt, hdg, nmPerLongitude, magneticVariation float32) bool

type AdaptationFix

type AdaptationFix struct {
	Name         string // not in JSON
	Type         string `json:"type"`
	ToFacility   string `json:"to"`   // controller to handoff to
	FromFacility string `json:"from"` // controller to handoff from
	Altitude     [2]int `json:"altitude"`
}

type AdaptationFixes

type AdaptationFixes []AdaptationFix

type AircraftPerformance

type AircraftPerformance struct {
	Name string `json:"name"`
	ICAO string `json:"icao"`
	// engines, weight class, category
	WeightClass string  `json:"weightClass"`
	Ceiling     float32 `json:"ceiling"`
	Engine      struct {
		AircraftType string `json:"type"`
	} `json:"engines"`
	Rate struct {
		Climb      float32 `json:"climb"` // ft / minute; reduce by 500 after alt 5000 if this is >=2500
		Descent    float32 `json:"descent"`
		Accelerate float32 `json:"accelerate"` // kts / 2 seconds
		Decelerate float32 `json:"decelerate"`
	} `json:"rate"`
	Category struct {
		SRS   int    `json:"srs"`
		LAHSO int    `json:"lahso"`
		CWT   string `json:"cwt"`
	}
	Runway struct {
		Takeoff float32 `json:"takeoff"` // nm
		Landing float32 `json:"landing"` // nm
	} `json:"runway"`
	Speed struct {
		Min        float32 `json:"min"`
		V2         float32 `json:"v2"`
		Landing    float32 `json:"landing"`
		CruiseTAS  float32 `json:"cruise"`
		CruiseMach float32 `json:"cruiseM"`
		MaxTAS     float32 `json:"max"`
		MaxMach    float32 `json:"maxM"`
	} `json:"speed"`
	Turn struct {
		MaxBankAngle float32 `json:"maxBankAngle"`
		MaxBankRate  float32 `json:"maxBankRate"`
	}
	Capacity struct {
		Passengers int `json:"passengers"`
		FuelPounds int `json:"fuel_pounds"`
	} `json:"capacity"`
}

func (AircraftPerformance) ApproachSpeed

func (ap AircraftPerformance) ApproachSpeed(windDirection, windSpeed, windGust float32, runwayHeading float32) float32

ApproachSpeed returns the final approach speed including wind additives. The runway heading is used to compute the headwind component of the provided wind. Jets and turboprops add half the headwind plus the full gust factor (not to exceed 20 knots). Pistons add half the gust factor... I suppose we should also add a max additive but most pistons won't be landing in very windy conditions

type AircraftTypeSnippetFormatter added in v0.13.2

type AircraftTypeSnippetFormatter struct{}

func (AircraftTypeSnippetFormatter) Spoken added in v0.13.2

func (AircraftTypeSnippetFormatter) Validate added in v0.13.2

func (AircraftTypeSnippetFormatter) Validate(arg any) error

func (AircraftTypeSnippetFormatter) Written added in v0.13.2

type Airline

type Airline struct {
	ICAO     string `json:"icao"`
	Name     string `json:"name"`
	Callsign struct {
		Name            string   `json:"name"`
		CallsignFormats []string `json:"callsignFormats"`
	} `json:"callsign"`
	JSONFleets map[string][][2]any `json:"fleets"`
	Fleets     map[string][]FleetAircraft
}

type AirlineSpecifier

type AirlineSpecifier struct {
	ICAO          string   `json:"icao"`
	Callsign      string   `json:"callsign,omitempty"`
	Fleet         string   `json:"fleet,omitempty"`
	AircraftTypes []string `json:"types,omitempty"`
}

func (AirlineSpecifier) Aircraft

func (a AirlineSpecifier) Aircraft() []FleetAircraft

func (*AirlineSpecifier) Check

func (a *AirlineSpecifier) Check(e *util.ErrorLogger)

func (AirlineSpecifier) SampleAcType added in v0.14.1

func (a AirlineSpecifier) SampleAcType(r *rand.Rand, departureAirport, arrivalAirport string, lg *log.Logger) string

func (AirlineSpecifier) SampleAcTypeAndCallsign

func (a AirlineSpecifier) SampleAcTypeAndCallsign(r *rand.Rand, currentCallsigns []ADSBCallsign, uniqueSuffix bool, departureAirport, arrivalAirport string, lg *log.Logger) (actype, callsign string)

currentCallsigns will be empty if we don't care about unique suffixes.

type Airport

type Airport struct {
	Location       math.Point2LL
	TowerListIndex int `json:"tower_list"`

	Approaches map[string]*Approach `json:"approaches,omitempty"`
	Departures []Departure          `json:"departures,omitempty"`

	VFR struct {
		Randoms VFRRandomsSpec `json:"random_routes"`
		Routes  []VFRRouteSpec `json:"routes"`
	} `json:"vfr"`

	// Optional: initial tracking controller, for cases where a virtual
	// controller has the initial track.
	DepartureController ControlPosition `json:"departure_controller"`
	HoldForRelease      bool            `json:"hold_for_release"`

	ExitCategories map[ExitID]string `json:"exit_categories"`

	// runway -> (exit -> route)
	DepartureRoutes map[RunwayID]map[ExitID]*ExitRoute `json:"departure_routes"`

	CRDARegions map[string]*CRDARegion `json:"crda_regions"`
	CRDAPairs   []CRDAPair             `json:"crda_pairs"`

	ATPAVolumes           map[string]*ATPAVolume `json:"atpa_volumes"`
	OmitArrivalScratchpad bool                   `json:"omit_arrival_scratchpad"`
	DepartureRunwaysAsOne []string               `json:"departure_runways_as_one"`
}

func (*Airport) PostDeserialize

func (ap *Airport) PostDeserialize(icao string, loc Locator, nmPerLongitude float32,
	magneticVariation float32, controlPositions map[ControlPosition]*Controller, scratchpads map[string]string,
	facilityAirports map[string]*Airport, checkScratchpad func(string) bool, e *util.ErrorLogger)

func (Airport) VFRRateSum

func (ap Airport) VFRRateSum() int

type AirportSnippetFormatter added in v0.13.2

type AirportSnippetFormatter struct{}

func (AirportSnippetFormatter) Spoken added in v0.13.2

func (AirportSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (AirportSnippetFormatter) Validate added in v0.13.2

func (AirportSnippetFormatter) Validate(arg any) error

func (AirportSnippetFormatter) Written added in v0.13.2

func (AirportSnippetFormatter) Written(arg any) string

type Airspace

type Airspace struct {
	Boundaries map[string][]math.Point2LL            `json:"boundaries"`
	Volumes    map[string][]ControllerAirspaceVolume `json:"volumes"`
}

type AirspaceGrid

type AirspaceGrid struct {
	// contains filtered or unexported fields
}

AirspaceGrid organizes AirspaceVolume definitions and provides efficient in volume tests via a grid in lat-long space that records which of a potentially large set of volumes overlap grid cells. Grid cells are initialized on demand rather than upfront, which saves storage

func MakeAirspaceGrid

func MakeAirspaceGrid(v []*AirspaceVolume) *AirspaceGrid

func (*AirspaceGrid) Below

func (g *AirspaceGrid) Below(p math.Point2LL, alt int) bool

func (*AirspaceGrid) Inside

func (g *AirspaceGrid) Inside(p math.Point2LL, alt int) bool

type AirspaceVolume

type AirspaceVolume struct {
	Id          string             `json:"id"`
	Description string             `json:"description"`
	Type        AirspaceVolumeType `json:"type"`
	Floor       int                `json:"floor"`
	Ceiling     int                `json:"ceiling"`
	// Polygon
	PolygonBounds *math.Extent2D               // not always set
	VerticesStr   util.OneOf[string, []string] `json:"vertices"`
	Vertices      []math.Point2LL
	Holes         [][]math.Point2LL `json:"holes"`
	// Circle
	Center math.Point2LL `json:"center"`
	Radius float32       `json:"radius"`
}

func (*AirspaceVolume) Below

func (a *AirspaceVolume) Below(p math.Point2LL, alt int) bool

func (*AirspaceVolume) Inside

func (a *AirspaceVolume) Inside(p math.Point2LL, alt int) bool

func (*AirspaceVolume) PostDeserialize

func (a *AirspaceVolume) PostDeserialize(loc Locator, e *util.ErrorLogger)

type AirspaceVolumeType

type AirspaceVolumeType int
const (
	AirspaceVolumeUnknown AirspaceVolumeType = iota
	AirspaceVolumePolygon
	AirspaceVolumeCircle
)

func (*AirspaceVolumeType) MarshalJSON

func (t *AirspaceVolumeType) MarshalJSON() ([]byte, error)

func (*AirspaceVolumeType) UnmarshalJSON

func (t *AirspaceVolumeType) UnmarshalJSON(b []byte) error

type Airway

type Airway struct {
	Name  string
	Fixes []AirwayFix
}

func (Airway) WaypointsBetween

func (a Airway) WaypointsBetween(wp0, wp1 string) ([]Waypoint, bool)

type AirwayDirection

type AirwayDirection int

type AirwayFix

type AirwayFix struct {
	Fix       string
	Level     AirwayLevel
	Direction AirwayDirection
}

type AirwayLevel

type AirwayLevel int

type AltRestrictionSnippetFormatter added in v0.13.2

type AltRestrictionSnippetFormatter struct{}

func (AltRestrictionSnippetFormatter) Spoken added in v0.13.2

func (AltRestrictionSnippetFormatter) Validate added in v0.13.2

func (AltRestrictionSnippetFormatter) Written added in v0.13.2

type AltSnippetFormatter added in v0.13.2

type AltSnippetFormatter struct{}

AltSnippetFormatter formats altitudes, which may be given as ints or float32s.

func (*AltSnippetFormatter) Spoken added in v0.13.2

func (a *AltSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (*AltSnippetFormatter) Validate added in v0.13.2

func (a *AltSnippetFormatter) Validate(arg any) error

func (*AltSnippetFormatter) Written added in v0.13.2

func (a *AltSnippetFormatter) Written(arg any) string

type AltitudeDirection added in v0.14.0

type AltitudeDirection int
const (
	AltitudeClimb AltitudeDirection = iota
	AltitudeDescend
	AltitudeMaintain
)

type AltitudeIntent added in v0.14.0

type AltitudeIntent struct {
	Altitude          float32
	Direction         AltitudeDirection
	AfterSpeed        *float32 // changing altitude only after reaching a speed
	Expedite          bool
	AlreadyExpediting bool
	ThenSpeed         *float32 // speed once we reach the altitude
	ThenSpeedType     SpeedType
}

AltitudeIntent represents climb/descend/maintain altitude commands

func (AltitudeIntent) Render added in v0.14.0

func (a AltitudeIntent) Render(rt *RadioTransmission, r *rand.Rand)

type AltitudeRestriction

type AltitudeRestriction struct {
	// We treat 0 as "unset", which works naturally for the bottom but
	// requires occasional care at the top.
	Range [2]float32
}

func ParseAltitudeRestriction

func ParseAltitudeRestriction(s string) (*AltitudeRestriction, error)

ParseAltitudeRestriction parses an altitude restriction in the compact text format used in scenario definition files.

func (AltitudeRestriction) ClampRange

func (a AltitudeRestriction) ClampRange(r [2]float32) (c [2]float32, ok bool)

ClampRange limits a range of altitudes to satisfy the altitude restriction; the returned Boolean indicates whether the ranges overlapped.

func (AltitudeRestriction) Encoded

func (a AltitudeRestriction) Encoded() string

Encoded returns the restriction in the encoded form in which it is specified in scenario configuration files, e.g. "5000+" for "at or above 5000".

func (AltitudeRestriction) TargetAltitude

func (a AltitudeRestriction) TargetAltitude(alt float32) float32

func (*AltitudeRestriction) UnmarshalJSON

func (a *AltitudeRestriction) UnmarshalJSON(b []byte) error

type AppControllerSnippetFormatter added in v0.13.2

type AppControllerSnippetFormatter struct{}

func (AppControllerSnippetFormatter) Spoken added in v0.13.2

func (AppControllerSnippetFormatter) Validate added in v0.13.2

func (AppControllerSnippetFormatter) Validate(arg any) error

func (AppControllerSnippetFormatter) Written added in v0.13.2

type Approach

type Approach struct {
	Id        string          `json:"cifp_id"`
	FullName  string          `json:"full_name"`
	Type      ApproachType    `json:"type"`
	Runway    string          `json:"runway"`
	Waypoints []WaypointArray `json:"waypoints"`

	// Set in Airport PostDeserialize()
	Threshold         math.Point2LL
	OppositeThreshold math.Point2LL
}

func (*Approach) ExtendedCenterline

func (ap *Approach) ExtendedCenterline(nmPerLongitude, magneticVariation float32) [2]math.Point2LL

func (*Approach) FAFSegment

func (ap *Approach) FAFSegment(nmPerLongitude, magneticVariation float32) ([]Waypoint, int)

Find the FAF: return the corresponding waypoint array and the index of the FAF within it.

func (*Approach) RunwayHeading

func (ap *Approach) RunwayHeading(nmPerLongitude, magneticVariation float32) float32

type ApproachIntent added in v0.14.0

type ApproachIntent struct {
	Type         ApproachIntentType
	ApproachName string // full name of the approach (e.g., "ILS Runway 22L")
	Fix          string // for AtFixCleared
	LAHSORunway  string // runway to hold short of (for LAHSO operations)
}

ApproachIntent represents approach-related commands

func (ApproachIntent) Render added in v0.14.0

func (a ApproachIntent) Render(rt *RadioTransmission, r *rand.Rand)

type ApproachIntentType added in v0.14.0

type ApproachIntentType int
const (
	ApproachExpect ApproachIntentType = iota
	ApproachIntercept
	ApproachJoin // for non-ILS approaches
	ApproachAtFixCleared
	ApproachAtFixIntercept
	ApproachCancel
)

type ApproachSnippetFormatter added in v0.13.2

type ApproachSnippetFormatter struct{}

func (ApproachSnippetFormatter) Spoken added in v0.13.2

func (ApproachSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (ApproachSnippetFormatter) Validate added in v0.13.2

func (ApproachSnippetFormatter) Validate(arg any) error

func (ApproachSnippetFormatter) Written added in v0.13.2

func (ApproachSnippetFormatter) Written(arg any) string

type ApproachType

type ApproachType int
const (
	UnknownApproach ApproachType = iota
	ILSApproach
	RNAVApproach
	ChartedVisualApproach
	LocalizerApproach
	VORApproach
)

func (ApproachType) MarshalJSON

func (at ApproachType) MarshalJSON() ([]byte, error)

func (ApproachType) String

func (at ApproachType) String() string

func (*ApproachType) UnmarshalJSON

func (at *ApproachType) UnmarshalJSON(b []byte) error

type Arrival

type Arrival struct {
	Waypoints       WaypointArray                       `json:"waypoints"`
	RunwayWaypoints map[string]map[string]WaypointArray `json:"runway_waypoints"` // Airport -> runway -> waypoints
	SpawnWaypoint   string                              `json:"spawn"`            // if "waypoints" aren't specified
	CruiseAltitude  float32                             `json:"cruise_altitude"`
	Route           string                              `json:"route"`
	STAR            string                              `json:"star"`

	InitialController   ControlPosition `json:"initial_controller"`
	InitialAltitude     float32         `json:"initial_altitude"`
	AssignedAltitude    float32         `json:"assigned_altitude"`
	InitialSpeed        float32         `json:"initial_speed"`
	SpeedRestriction    float32         `json:"speed_restriction"`
	Scratchpad          string          `json:"scratchpad"`
	SecondaryScratchpad string          `json:"secondary_scratchpad"`
	Description         string          `json:"description"`
	CoordinationFix     string          `json:"coordination_fix"`
	IsRNAV              bool            `json:"is_rnav"`

	ExpectApproach util.OneOf[string, map[string]string] `json:"expect_approach"`

	// Airport -> arrival airlines
	Airlines map[string][]ArrivalAirline `json:"airlines"`
}

func (Arrival) GetRunwayWaypoints

func (ar Arrival) GetRunwayWaypoints(airport, rwy string) WaypointArray

func (*Arrival) PostDeserialize

func (ar *Arrival) PostDeserialize(loc Locator, nmPerLongitude float32, magneticVariation float32,
	airports map[string]*Airport, controlPositions map[ControlPosition]*Controller, checkScratchpad func(string) bool,
	e *util.ErrorLogger)

type ArrivalAirline

type ArrivalAirline struct {
	AirlineSpecifier
	Airport string `json:"airport"`
}

type BasicNumberSnippetFormatter added in v0.13.2

type BasicNumberSnippetFormatter struct{}

func (BasicNumberSnippetFormatter) Spoken added in v0.13.2

func (BasicNumberSnippetFormatter) Validate added in v0.13.2

func (BasicNumberSnippetFormatter) Validate(arg any) error

func (BasicNumberSnippetFormatter) Written added in v0.13.2

func (BasicNumberSnippetFormatter) Written(arg any) string

type BeaconCodeSnippetFormatter added in v0.13.2

type BeaconCodeSnippetFormatter struct{}

func (BeaconCodeSnippetFormatter) Spoken added in v0.13.2

func (BeaconCodeSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (BeaconCodeSnippetFormatter) Validate added in v0.13.2

func (BeaconCodeSnippetFormatter) Validate(arg any) error

func (BeaconCodeSnippetFormatter) Written added in v0.13.2

func (BeaconCodeSnippetFormatter) Written(arg any) string

type BeaconCodeTable

type BeaconCodeTable struct {
	VFRCodes [][2]Squawk
}

type BeaconCodeTableSpecifier

type BeaconCodeTableSpecifier struct {
	VFRCodes []string `json:"vfr_codes"` // Array of squawk code ranges

}

type CRDAPair added in v0.14.1

type CRDAPair struct {
	Regions                [2]string                        `json:"crda_regions"`
	TieSymbol              string                           `json:"tie_symbol"`
	StaggerSymbol          string                           `json:"stagger_symbol"`
	TieOffset              float32                          `json:"tie_offset"`
	LeaderDirectionStrings [2]string                        `json:"leader_directions"`
	LeaderDirections       [2]math.CardinalOrdinalDirection // not in JSON, set during deserialize
	ConvergencePoint       math.Point2LL                    // not in JSON, set during deserialize
}

type CRDARegion added in v0.14.1

type CRDARegion struct {
	Name             string  // set during deserialization from map key
	HeadingTolerance float32 `json:"heading_tolerance"`

	// Straight-line reference (mutually exclusive with ReferenceRoute)
	ReferenceLineHeading   float32       `json:"reference_heading"`
	ReferenceLineLength    float32       `json:"reference_length"`
	ReferencePointAltitude float32       `json:"reference_altitude"`
	ReferencePoint         math.Point2LL `json:"reference_point"`

	// Route-based reference (mutually exclusive with straight-line fields)
	ReferenceRoute string `json:"reference_route"`

	// lateral qualification region
	NearDistance  float32 `json:"near_distance"`
	NearHalfWidth float32 `json:"near_half_width"`
	FarHalfWidth  float32 `json:"far_half_width"`
	RegionLength  float32 `json:"region_length"`

	// vertical qualification region
	DescentPointDistance   float32 `json:"descent_distance"`
	DescentPointAltitude   float32 `json:"descent_altitude"`
	AboveAltitudeTolerance float32 `json:"above_altitude_tolerance"`
	BelowAltitudeTolerance float32 `json:"below_altitude_tolerance"`

	ScratchpadPatterns []string `json:"scratchpad_patterns"`

	// Computed during PostDeserialize
	Path              Path
	DistToConvergence float32 // distance from path end to convergence point
}

func (*CRDARegion) CourseLine added in v0.14.1

func (ar *CRDARegion) CourseLine(nmPerLongitude float32) []math.Point2LL

CourseLine returns a polyline for drawing the course line of this CRDA region.

func (*CRDARegion) Inside added in v0.14.1

func (ar *CRDARegion) Inside(p math.Point2LL, alt float32, nmPerLongitude float32) (lateral, vertical bool)

func (*CRDARegion) QualificationPolygon added in v0.14.1

func (ar *CRDARegion) QualificationPolygon(nmPerLongitude float32) []math.Point2LL

QualificationPolygon returns the polygon outline of the qualification region for drawing.

func (*CRDARegion) TryMakeGhost added in v0.14.1

func (ar *CRDARegion) TryMakeGhost(trk RadarTrack, heading float32,
	scratchpad string, forceGhost bool, offset float32, leaderDirection math.CardinalOrdinalDirection,
	nmPerLongitude float32, other *CRDARegion) *GhostTrack

type CRDARoutePoint added in v0.14.1

type CRDARoutePoint struct {
	Fix      string
	Location math.Point2LL
	Arc      *DMEArc
}

CRDARoutePoint represents a single point in a CRDA reference route. Only fix names and /arc qualifiers are supported.

type CallsignArg added in v0.13.3

type CallsignArg struct {
	Callsign           ADSBCallsign
	IsEmergency        bool
	AlwaysFullCallsign bool
}

CallsignArg provides additional context for formatting callsigns.

type CallsignSnippetFormatter added in v0.13.2

type CallsignSnippetFormatter struct{}

func (CallsignSnippetFormatter) Spoken added in v0.13.2

func (CallsignSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (CallsignSnippetFormatter) Validate added in v0.13.2

func (CallsignSnippetFormatter) Validate(arg any) error

func (CallsignSnippetFormatter) Written added in v0.13.2

func (CallsignSnippetFormatter) Written(arg any) string

type ClearedApproachIntent added in v0.14.0

type ClearedApproachIntent struct {
	Approach   string
	StraightIn bool
	CancelHold bool
}

ClearedApproachIntent represents approach clearance

func (ClearedApproachIntent) Render added in v0.14.0

type CommandIntent added in v0.14.0

type CommandIntent interface {
	// Render adds the appropriate text for this intent to the transmission.
	Render(rt *RadioTransmission, r *rand.Rand)
}

CommandIntent represents the semantic meaning of a pilot readback. Instead of generating RadioTransmission text directly, commands return intents that are later rendered together for coherent multi-command responses.

type ContactIntent added in v0.14.0

type ContactIntent struct {
	Type         ContactType
	ToController *Controller // the controller being contacted
	Frequency    Frequency
	IsDeparture  bool // affects rendering (departure vs approach controller)
}

ContactIntent represents contact/handoff commands

func (ContactIntent) Render added in v0.14.0

func (c ContactIntent) Render(rt *RadioTransmission, r *rand.Rand)

type ContactTowerIntent added in v0.14.0

type ContactTowerIntent struct{}

ContactTowerIntent represents contact tower command

func (ContactTowerIntent) Render added in v0.14.0

func (c ContactTowerIntent) Render(rt *RadioTransmission, r *rand.Rand)

type ContactType added in v0.14.0

type ContactType int
const (
	ContactController ContactType = iota
	ContactGoodbye
	ContactRadarTerminated
)

type ControlPosition added in v0.13.3

type ControlPosition string

ControlPosition identifies a controller position in either STARS or ERAM. For STARS, this is the TCP (Terminal Control Position) like "2K" or "4P". For ERAM, this is the sector identifier like "N56" or "W05". This is the generic type used throughout the codebase for any controller position.

type Controller

type Controller struct {
	Position           string    // This is the key in the controllers map in JSON (now the sector ID, e.g. "1N", "4P")
	Callsign           string    `json:"callsign,omitempty"` // Human-readable callsign (e.g. "PHL_NA_APP")
	RadioName          string    `json:"radio_name"`
	Frequency          Frequency `json:"frequency"`
	Scope              string    `json:"scope_char"`     // Optional. If unset, facility id is used for external, last char of position for local.
	FacilityIdentifier string    `json:"-"`              // Set programmatically by loadNeighborControllers (e.g. "N" in "N4P")
	ERAMFacility       bool      `json:"-"`              // Set at runtime from facility type; true for ARTCC controllers
	Facility           string    `json:"facility"`       // So we can get the STARS facility from a controller
	Area               string    `json:"area,omitempty"` // For TRACON: auto-derived from first digit of Position. For ERAM: must be manually specified.
}

func (Controller) ERAMID added in v0.13.0

func (c Controller) ERAMID() string

func (Controller) IsExternal

func (c Controller) IsExternal() bool

func (Controller) PositionId added in v0.13.3

func (c Controller) PositionId() ControlPosition

type ControllerAirspaceVolume

type ControllerAirspaceVolume struct {
	LowerLimit    int               `json:"lower"`
	UpperLimit    int               `json:"upper"`
	Boundaries    [][]math.Point2LL `json:"boundary_polylines"` // not in JSON
	BoundaryNames []string          `json:"boundaries"`
	Label         string            `json:"label"`
	LabelPosition math.Point2LL     `json:"label_position"`
}

type DMEArc

type DMEArc struct {
	Fix            string
	Center         math.Point2LL
	Radius         float32
	Length         float32
	InitialHeading float32
	Direction      DMEArcDirection
}

Can either be specified with (Fix,Radius), or (Length,Direction); the remaining fields are then derived from those.

func (*DMEArc) Initialize added in v0.14.1

func (arc *DMEArc) Initialize(loc Locator, startLoc, endLoc math.Point2LL, nmPerLongitude, magneticVariation float32, e *util.ErrorLogger) bool

Initialize resolves the arc's center, radius, and initial heading from its specification. Direction must be set before calling. startLoc and endLoc are the waypoint positions at each end of the arc. Returns true on success; returns false if the arc should be dropped (either due to error or because it's approximately linear).

type DMEArcDirection added in v0.14.1

type DMEArcDirection int
const (
	DMEArcDirectionUnset            DMEArcDirection = iota
	DMEArcDirectionClockwise                        // right turn
	DMEArcDirectionCounterClockwise                 // left turn
)

func (DMEArcDirection) IsClockwise added in v0.14.1

func (d DMEArcDirection) IsClockwise() bool

type DepControllerSnippetFormatter added in v0.13.2

type DepControllerSnippetFormatter struct{}

func (DepControllerSnippetFormatter) Spoken added in v0.13.2

func (DepControllerSnippetFormatter) Validate added in v0.13.2

func (DepControllerSnippetFormatter) Validate(arg any) error

func (DepControllerSnippetFormatter) Written added in v0.13.2

type Departure

type Departure struct {
	Exit ExitID `json:"exit"`

	Destination         string                  `json:"destination"`
	Altitudes           util.SingleOrArray[int] `json:"altitude,omitempty"`
	Route               string                  `json:"route"`
	RouteWaypoints      WaypointArray           // not specified in user JSON
	Airlines            []DepartureAirline      `json:"airlines"`
	Scratchpad          string                  `json:"scratchpad"`           // optional
	SecondaryScratchpad string                  `json:"secondary_scratchpad"` // optional
	Description         string                  `json:"description"`
}

type DepartureAirline

type DepartureAirline struct {
	AirlineSpecifier
}

type ERAMAdaptation

type ERAMAdaptation struct {
	ARTCC             string                     // not in JSON
	CoordinationFixes map[string]AdaptationFixes `json:"coordination_fixes"`
}

type EnrouteSquawkCodePool

type EnrouteSquawkCodePool struct {
	Available *util.IntRangeSet

	// Initial is maintained as a read-only snapshot of the initial set of
	// available codes; it allows us to catch cases where the caller tries
	// to return code that is inside the range we cover but was removed
	// from the pool when it was first initialized.
	Initial *util.IntRangeSet
}

func MakeEnrouteSquawkCodePool

func MakeEnrouteSquawkCodePool(loc *LocalSquawkCodePool) *EnrouteSquawkCodePool

func (*EnrouteSquawkCodePool) Get

func (p *EnrouteSquawkCodePool) Get(r *rand.Rand) (Squawk, error)

func (*EnrouteSquawkCodePool) InInitialPool

func (p *EnrouteSquawkCodePool) InInitialPool(code Squawk) bool

func (*EnrouteSquawkCodePool) IsAssigned

func (p *EnrouteSquawkCodePool) IsAssigned(code Squawk) bool

func (*EnrouteSquawkCodePool) NumAvailable

func (p *EnrouteSquawkCodePool) NumAvailable() int

func (*EnrouteSquawkCodePool) Return

func (p *EnrouteSquawkCodePool) Return(code Squawk) error

func (*EnrouteSquawkCodePool) Take

func (p *EnrouteSquawkCodePool) Take(code Squawk) error

type ExitID added in v0.14.1

type ExitID string

ExitID is an exit fix identifier that may include a dot-separated suffix (e.g., "COLIN.P"). Use Base() for navaid lookups and display.

func (ExitID) Base added in v0.14.1

func (e ExitID) Base() string

type ExitRoute

type ExitRoute struct {
	SID              string        `json:"sid"`
	AssignedAltitude int           `json:"assigned_altitude"`
	ClearedAltitude  int           `json:"cleared_altitude"`
	SpeedRestriction int           `json:"speed_restriction"`
	Waypoints        WaypointArray `json:"waypoints"`
	Description      string        `json:"description"`
	IsRNAV           bool          `json:"is_rnav"`
	HoldForRelease   bool          `json:"hold_for_release"`
	// optional, control position to handoff to at a /ho
	HandoffController ControlPosition `json:"handoff_controller"`
	// optional, the initial tracking controller for the departure.
	DepartureController ControlPosition `json:"departure_controller"`

	WaitToContactDeparture bool // whether the aircraft waits until a /TC point to contact departure
}

func (ExitRoute) FinalHeading added in v0.14.0

func (er ExitRoute) FinalHeading() int

FinalHeading returns the final heading from the exit route's waypoints. Returns 0 if no heading waypoint is found.

type FAAAirport

type FAAAirport struct {
	Id         string
	Name       string
	Country    string
	Elevation  int
	Location   math.Point2LL
	Runways    []Runway
	Approaches map[string]Approach
	STARs      map[string]STAR
	ARTCC      string
}

func (FAAAirport) SelectBestRunway

func (ap FAAAirport) SelectBestRunway(windDir float32, magneticVariation float32) (*Runway, *Runway)

func (FAAAirport) ValidRunways

func (ap FAAAirport) ValidRunways() string

type Facility added in v0.14.0

type Facility struct {
	Name      string
	Latitude  float32
	Longitude float32
	Radius    float32
}

Facility represents a geographic facility with a center point and radius. Both TRACONs and ARTCCs use this structure for weather data handling.

func (Facility) Center added in v0.14.0

func (f Facility) Center() math.Point2LL

type Fix

type Fix struct {
	Id       string
	Location math.Point2LL
}

type FixSnippetFormatter added in v0.13.2

type FixSnippetFormatter struct{}

func (FixSnippetFormatter) Spoken added in v0.13.2

func (f FixSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (FixSnippetFormatter) Validate added in v0.13.2

func (FixSnippetFormatter) Validate(arg any) error

func (FixSnippetFormatter) Written added in v0.13.2

func (FixSnippetFormatter) Written(arg any) string

type FleetAircraft

type FleetAircraft struct {
	ICAO  string
	Count int
}

type FlightPlan

type FlightPlan struct {
	Rules            FlightRules
	AircraftType     string
	CruiseSpeed      int
	DepartureAirport string
	DepartureRunway  string
	Altitude         int
	ArrivalAirport   string
	AlternateAirport string
	Exit             ExitID
	Route            string
	Remarks          string
}

FlightPlan represents the flight plan from the perspective of the Aircraft: who they are, what they're doing, how they're going to get there.

type FlightRules

type FlightRules int
const (
	FlightRulesUnknown FlightRules = iota
	FlightRulesIFR
	FlightRulesVFR
	FlightRulesDVFR
	FlightRulesSVFR
)

func (FlightRules) String

func (f FlightRules) String() string

type Frequency

type Frequency int

Frequencies are scaled by 1000 and then stored in integers.

func NewFrequency

func NewFrequency(f float32) Frequency

func (Frequency) String

func (f Frequency) String() string

type FrequencySnippetFormatter added in v0.13.2

type FrequencySnippetFormatter struct{}

func (FrequencySnippetFormatter) Spoken added in v0.13.2

func (FrequencySnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (FrequencySnippetFormatter) Validate added in v0.13.2

func (FrequencySnippetFormatter) Validate(arg any) error

func (FrequencySnippetFormatter) Written added in v0.13.2

func (FrequencySnippetFormatter) Written(arg any) string

type GACallsignArg added in v0.14.0

type GACallsignArg struct {
	Callsign     ADSBCallsign
	AircraftType string // e.g., "C172"
	UseTypeForm  bool   // If true, use type+trailing3 form
	IsEmergency  bool
}

GACallsignArg provides context for formatting GA callsigns with type-based addressing. When UseTypeForm is true, the callsign is spoken as "aircraft type + trailing 3" (e.g., "skyhawk 3 alpha bravo" instead of "november 1 2 3 alpha bravo").

type GhostTrack

type GhostTrack struct {
	ADSBCallsign        ADSBCallsign
	Position            math.Point2LL
	Groundspeed         int
	LeaderLineDirection math.CardinalOrdinalDirection
	TrackId             string
}

type GroupFormSnippetFormatter added in v0.13.2

type GroupFormSnippetFormatter struct{}

func (GroupFormSnippetFormatter) Spoken added in v0.13.2

func (GroupFormSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (GroupFormSnippetFormatter) Validate added in v0.13.2

func (GroupFormSnippetFormatter) Validate(arg any) error

func (GroupFormSnippetFormatter) Written added in v0.13.2

func (GroupFormSnippetFormatter) Written(arg any) string

type HeadingIntent added in v0.14.0

type HeadingIntent struct {
	Heading    float32
	Type       HeadingType
	Turn       HeadingTurn // for HeadingAssign: which way to turn
	Degrees    int         // for HeadingTurnLeft/Right: how many degrees
	CancelHold bool        // heading cancels an active hold
}

HeadingIntent represents heading assignment commands

func (HeadingIntent) Render added in v0.14.0

func (h HeadingIntent) Render(rt *RadioTransmission, r *rand.Rand)

type HeadingSnippetFormatter added in v0.13.2

type HeadingSnippetFormatter struct{}

func (HeadingSnippetFormatter) Spoken added in v0.13.2

func (HeadingSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (HeadingSnippetFormatter) Validate added in v0.13.2

func (HeadingSnippetFormatter) Validate(arg any) error

func (HeadingSnippetFormatter) Written added in v0.13.2

func (HeadingSnippetFormatter) Written(arg any) string

type HeadingTurn added in v0.14.0

type HeadingTurn int
const (
	HeadingTurnClosest HeadingTurn = iota
	HeadingTurnToLeft
	HeadingTurnToRight
)

type HeadingType added in v0.14.0

type HeadingType int
const (
	HeadingAssign HeadingType = iota
	HeadingTurnLeft
	HeadingTurnRight
	HeadingPresent
)

type Hold added in v0.13.0

type Hold struct {
	Fix             string  // Fix identifier where hold is located
	InboundCourse   float32 // Inbound magnetic course to the fix
	TurnDirection   TurnDirection
	LegLengthNM     float32 // Distance-based leg length (nautical miles), 0 if time-based
	LegMinutes      float32 // Time-based leg duration (minutes), 0 if distance-based
	MinimumAltitude int     // Minimum altitude for hold (feet)
	MaximumAltitude int     // Maximum altitude for hold (feet), 0 if no maximum
	HoldingSpeed    int     // Speed limit in hold (knots), 0 if not specified
	Procedure       string  // Associated procedure (e.g., "ILS06 (IAP)", "CAMRN5", "ENROUTE HIGH")
}

Hold represents a charted holding pattern from CIFP or HPF

func (Hold) DisplayName added in v0.13.0

func (h Hold) DisplayName() string

func (Hold) Entry added in v0.13.0

func (h Hold) Entry(headingToFix float32) HoldEntry

func (Hold) Speed added in v0.13.0

func (h Hold) Speed(alt float32) float32

Speed returns the holding speed in knots for the given altitude. If the hold has a published holding speed, that is returned. Otherwise, standard holding speeds are applied based on altitude: ≤6000 ft: 200 knots, ≤14000 ft: 230 knots, >14000 ft: 265 knots.

type HoldEntry added in v0.13.0

type HoldEntry int
const (
	HoldEntryDirect HoldEntry = iota
	HoldEntryParallel
	HoldEntryTeardrop
)

func (HoldEntry) String added in v0.13.0

func (e HoldEntry) String() string

type InboundFlow

type InboundFlow struct {
	Arrivals    []Arrival    `json:"arrivals"`
	Overflights []Overflight `json:"overflights"`
}

func (InboundFlow) HasHumanHandoff added in v0.13.3

func (f InboundFlow) HasHumanHandoff() bool

HasHumanHandoff returns true if any arrival or overflight in the flow has a waypoint with HumanHandoff set.

func (InboundFlow) InitialControllers added in v0.13.3

func (f InboundFlow) InitialControllers() []ControlPosition

InitialControllers returns a list of all initial controllers specified for arrivals and overflights in this flow.

type LetterSnippetFormatter added in v0.13.2

type LetterSnippetFormatter struct{}

func (LetterSnippetFormatter) Spoken added in v0.13.2

func (LetterSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (LetterSnippetFormatter) Validate added in v0.13.2

func (LetterSnippetFormatter) Validate(arg any) error

func (LetterSnippetFormatter) Written added in v0.13.2

func (LetterSnippetFormatter) Written(arg any) string

type LocalPool

type LocalPool struct {
	Initial     *util.IntRangeSet
	Available   *util.IntRangeSet
	Ranges      [][2]Squawk
	Backups     string
	FlightRules FlightRules
}

type LocalSquawkCodePool

type LocalSquawkCodePool struct {
	Pools           map[string]LocalPool
	BeaconCodeTable BeaconCodeTable
}

func (*LocalSquawkCodePool) Get

func (p *LocalSquawkCodePool) Get(spec string, rules FlightRules, r *rand.Rand) (Squawk, FlightRules, error)

inbound rules are only used to choose a VFR/IFR pool if spec == ""

func (*LocalSquawkCodePool) InInitialPool

func (p *LocalSquawkCodePool) InInitialPool(code Squawk) bool

func (*LocalSquawkCodePool) IsAssigned

func (p *LocalSquawkCodePool) IsAssigned(code Squawk) bool

func (*LocalSquawkCodePool) IsReservedVFRCode

func (p *LocalSquawkCodePool) IsReservedVFRCode(sq Squawk) bool

func (*LocalSquawkCodePool) Return

func (p *LocalSquawkCodePool) Return(sq Squawk) error

type LocalSquawkCodePoolSpecifier

type LocalSquawkCodePoolSpecifier struct {
	Pools           map[string]PoolSpecifier `json:"auto_assignable_codes"`
	BeaconCodeTable BeaconCodeTableSpecifier `json:"beacon_code_table"`
}

SSR Codes Windows

func (*LocalSquawkCodePoolSpecifier) PostDeserialize

func (s *LocalSquawkCodePoolSpecifier) PostDeserialize(e *util.ErrorLogger)

type Locator

type Locator interface {
	// Locate returns the lat-long coordinates of the named point if they
	// are available; the bool indicates whether the point was known.
	Locate(fix string) (math.Point2LL, bool)

	// If Locate fails, Similar can be called to get alternatives that are
	// similarly-spelled to be offered in error messages.
	Similar(fix string) []string
}

Locator is a simple interface to abstract looking up the location of a named thing (e.g. a fix). This is mostly present so that the route code can call back into the ScenarioGroup to resolve locations accounting for fixes defined in a scenario, without exposing Scenario-related types to the aviation package.

type MVA

type MVA struct {
	MinimumLimit          int                      `xml:"minimumLimit"`
	MinimumLimitReference string                   `xml:"minimumLimitReference"`
	Proj                  *MVAHorizontalProjection `xml:"horizontalProjection"`
	Bounds                math.Extent2D
	ExteriorRing          [][2]float32
	InteriorRings         [][][2]float32
}

func (*MVA) Inside

func (m *MVA) Inside(p [2]float32) bool

type MVAExterior

type MVAExterior struct {
	LinearRing MVALinearRing `xml:"LinearRing"`
}

type MVAGrid added in v0.14.0

type MVAGrid struct {
	// contains filtered or unexported fields
}

MVAGrid organizes MVA definitions and provides efficient lookups via a grid in lat-long space that records which MVAs overlap grid cells. Grid cells are initialized on demand rather than upfront.

func MakeMVAGrid added in v0.14.0

func MakeMVAGrid(mvas []MVA) *MVAGrid

func (*MVAGrid) GetMVA added in v0.14.0

func (g *MVAGrid) GetMVA(p [2]float32) int

GetMVA returns the maximum MVA altitude at the given location. Returns 0 if no MVA covers the point.

type MVAHorizontalProjection

type MVAHorizontalProjection struct {
	Surface MVASurface `xml:"Surface"`
}

type MVAInterior

type MVAInterior struct {
	LinearRing MVALinearRing `xml:"LinearRing"`
}

type MVALinearRing

type MVALinearRing struct {
	PosList string `xml:"posList"`
}

func (MVALinearRing) Vertices

func (r MVALinearRing) Vertices() [][2]float32

type MVAPatches

type MVAPatches struct {
	PolygonPatch MVAPolygonPatch `xml:"PolygonPatch"`
}

type MVAPolygonPatch

type MVAPolygonPatch struct {
	Exterior  MVAExterior   `xml:"exterior"`
	Interiors []MVAInterior `xml:"interior"`
}

type MVASurface

type MVASurface struct {
	Patches MVAPatches `xml:"patches"`
}

type MachSnippetFormatter added in v0.14.1

type MachSnippetFormatter struct{}

func (MachSnippetFormatter) Spoken added in v0.14.1

func (MachSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (MachSnippetFormatter) Validate added in v0.14.1

func (MachSnippetFormatter) Validate(arg any) error

func (MachSnippetFormatter) Written added in v0.14.1

func (MachSnippetFormatter) Written(arg any) string

type MagneticGrid

type MagneticGrid struct {
	MinLatitude, MaxLatitude   float32
	MinLongitude, MaxLongitude float32
	LatLongStep                float32
	Samples                    []float32
}

func (*MagneticGrid) Lookup

func (mg *MagneticGrid) Lookup(p math.Point2LL) (float32, error)

type MixUpIntent added in v0.14.0

type MixUpIntent struct {
	Callsign    ADSBCallsign
	IsEmergency bool
}

MixUpIntent represents pilot confusion about who was addressed

func (MixUpIntent) Render added in v0.14.0

func (m MixUpIntent) Render(rt *RadioTransmission, r *rand.Rand)
type Navaid struct {
	Id       string
	Type     string
	Name     string
	Location math.Point2LL
}
type NavigationIntent struct {
	Type           NavigationType
	Fix            string
	SecondFix      string               // for DepartFixDirect
	Heading        float32              // for DepartFixHeading
	HoldDirection  string               // "left" or "right" for holds
	HoldLegLength  string               // e.g., "2 mile" or "1 minute"
	AltRestriction *AltitudeRestriction // for CrossFixAt
	Speed          *float32             // for CrossFixAt
	Mach           *float32             // for CrossFixAt
}

NavigationIntent represents navigation commands (direct, hold, depart fix, etc.)

func (n NavigationIntent) Render(rt *RadioTransmission, r *rand.Rand)
type NavigationType int
const (
	NavDirectFix         NavigationType = iota
	NavDirectFixFromHold                // direct fix that cancels a hold
	NavHold
	NavDepartFixDirect
	NavDepartFixHeading
	NavCrossFixAt
	NavResumeOwnNav
	NavAltitudeDiscretion
)

type Overflight

type Overflight struct {
	Waypoints           WaypointArray           `json:"waypoints"`
	InitialAltitudes    util.SingleOrArray[int] `json:"initial_altitude"`
	CruiseAltitude      float32                 `json:"cruise_altitude"`
	AssignedAltitude    float32                 `json:"assigned_altitude"`
	InitialSpeed        float32                 `json:"initial_speed"`
	AssignedSpeed       float32                 `json:"assigned_speed"`
	SpeedRestriction    float32                 `json:"speed_restriction"`
	InitialController   ControlPosition         `json:"initial_controller"`
	Scratchpad          string                  `json:"scratchpad"`
	SecondaryScratchpad string                  `json:"secondary_scratchpad"`
	Description         string                  `json:"description"`
	IsRNAV              bool                    `json:"is_rnav"`
	Airlines            []OverflightAirline     `json:"airlines"`
}

func (*Overflight) PostDeserialize

func (of *Overflight) PostDeserialize(loc Locator, nmPerLongitude float32, magneticVariation float32,
	airports map[string]*Airport, controlPositions map[ControlPosition]*Controller, checkScratchpad func(string) bool,
	e *util.ErrorLogger)

type OverflightAirline

type OverflightAirline struct {
	AirlineSpecifier
	DepartureAirport string `json:"departure_airport"`
	ArrivalAirport   string `json:"arrival_airport"`
}

type PTType

type PTType int

func (PTType) String

func (pt PTType) String() string

type Path added in v0.14.1

type Path struct {
	Segments []PathSegment
	Length   float32
}

Path represents a piecewise curve (line segments and circular arcs) in NM coordinates. Path direction follows aircraft travel direction: the first point is the far end, the last point is the convergence end (threshold/fix).

func PathFromReferenceLine added in v0.14.1

func PathFromReferenceLine(refPoint math.Point2LL, heading, length, nmPerLongitude, magneticVariation float32) Path

PathFromReferenceLine creates a Path from a straight reference line defined by a reference point, heading, and length. The path goes from far end toward the reference point (matching the aircraft travel direction convention).

func PathFromRoutePoints added in v0.14.1

func PathFromRoutePoints(pts []CRDARoutePoint, nmPerLongitude float32) Path

PathFromRoutePoints creates a Path from resolved CRDA route points. Consecutive point pairs become segments, using pt.Arc for arc segments.

func (*Path) PointAtDistance added in v0.14.1

func (path *Path) PointAtDistance(dist float32) (point [2]float32, heading float32)

PointAtDistance returns the point and heading at a given distance along the path. If dist exceeds the path length, the path is extended linearly along the last segment's final heading. If dist is negative, the path is extended linearly backwards from the first segment.

func (*Path) Polyline added in v0.14.1

func (path *Path) Polyline() [][2]float32

Polyline returns a polyline approximation of the path for drawing. Arc segments are sampled at approximately 1-degree intervals.

func (*Path) Project added in v0.14.1

func (path *Path) Project(p [2]float32) (dist, perpOffset, heading float32)

Project projects a point onto the path, returning the distance along the path, the signed perpendicular offset (positive = left of path direction), and the local path heading (degrees, true north).

type PathArc added in v0.14.1

type PathArc struct {
	Center     [2]float32
	Radius     float32
	StartAngle float32 // angle from center to P0 (radians)
	Sweep      float32 // signed: positive=CCW, negative=CW
}

type PathSegment added in v0.14.1

type PathSegment struct {
	P0, P1    [2]float32 // start/end in NM coordinates
	Arc       *PathArc   // nil for straight segments
	StartDist float32    // cumulative distance at segment start
	Length    float32    // segment length
}

type PhraseFormatString added in v0.13.2

type PhraseFormatString string

PhraseFormatString is a string that potentially includes

func (PhraseFormatString) Spoken added in v0.13.2

func (s PhraseFormatString) Spoken(r *rand.Rand, args []any) string

func (PhraseFormatString) Validate added in v0.13.2

func (s PhraseFormatString) Validate(args []any, lg *log.Logger) bool

func (PhraseFormatString) Written added in v0.13.2

func (s PhraseFormatString) Written(r *rand.Rand, args []any) string

type PoolSpecifier

type PoolSpecifier struct {
	Ranges  []string `json:"ranges"`
	Rules   string   `json:"flight_rules"`
	Backups string   `json:"backup_pool_list"`
}

type ProcedureIntent added in v0.14.0

type ProcedureIntent struct {
	Type ProcedureType
}

ProcedureIntent represents climb via SID / descend via STAR

func (ProcedureIntent) Render added in v0.14.0

func (p ProcedureIntent) Render(rt *RadioTransmission, r *rand.Rand)

type ProcedureTurn

type ProcedureTurn struct {
	Type         PTType
	RightTurns   bool
	ExitAltitude int     `json:",omitempty"`
	MinuteLimit  float32 `json:",omitempty"`
	NmLimit      float32 `json:",omitempty"`
	Entry180NoPT bool    `json:",omitempty"`
}

func (*ProcedureTurn) SelectRacetrackEntry

func (pt *ProcedureTurn) SelectRacetrackEntry(inboundHeading float32, aircraftFixHeading float32) RacetrackPTEntry

type ProcedureType added in v0.14.0

type ProcedureType int
const (
	ProcedureClimbViaSID ProcedureType = iota
	ProcedureDescendViaSTAR
)

type RacetrackPTEntry

type RacetrackPTEntry int

func (RacetrackPTEntry) MarshalJSON

func (e RacetrackPTEntry) MarshalJSON() ([]byte, error)

func (RacetrackPTEntry) String

func (e RacetrackPTEntry) String() string

func (*RacetrackPTEntry) UnmarshalJSON

func (e *RacetrackPTEntry) UnmarshalJSON(b []byte) error

type RadarSite

type RadarSite struct {
	Char           string        `json:"char"`
	PositionString string        `json:"position"`
	Position       math.Point2LL // not in JSON, set during deserialize

	Elevation      int32   `json:"elevation"`
	PrimaryRange   int32   `json:"primary_range"`
	SecondaryRange int32   `json:"secondary_range"`
	SlopeAngle     float32 `json:"slope_angle"`
	SilenceAngle   float32 `json:"silence_angle"`
}

func (*RadarSite) CheckVisibility

func (rs *RadarSite) CheckVisibility(p math.Point2LL, altitude int) (primary, secondary bool, distance float32)

type RadarTrack

type RadarTrack struct {
	ADSBCallsign        ADSBCallsign
	Squawk              Squawk
	Mode                TransponderMode
	Ident               bool
	TrueAltitude        float32
	TransponderAltitude float32
	Location            math.Point2LL
	Heading             float32
	Groundspeed         float32
	TypeOfFlight        TypeOfFlight
}

type RadioTransmission added in v0.13.2

type RadioTransmission struct {
	Strings []PhraseFormatString
	Args    [][]any // each slice contains values passed to the corresponding PhraseFormatString
	Type    RadioTransmissionType
}

RadioTransmission holds components that together represent a single radio transmission by a pilot; they may be built up from multiple instructions provided in a single controller command.

func MakeContactTransmission added in v0.13.2

func MakeContactTransmission(s string, args ...any) *RadioTransmission

MakeContactRadioTransmission is a helper function to make a pilot transmission for initial contact from a single formatting string and set of arguments.

func MakeMixedUpTransmission added in v0.13.2

func MakeMixedUpTransmission(s string, args ...any) *RadioTransmission

MakeMixedUpTransmission creates a pilot transmission when the pilot is confused about who is being addressed.

func MakeNoIdTransmission added in v0.14.0

func MakeNoIdTransmission(s string, args ...any) *RadioTransmission

MakeNoIdTransmission creates a pilot transmission where the pilot doesn't identify themselves with their callsign (e.g., for saying "blocked").

func MakeReadbackTransmission added in v0.13.2

func MakeReadbackTransmission(s string, args ...any) *RadioTransmission

MakeReadbackTransmission is a helper function to make a pilot transmission of a readback from a single formatting string and set of arguments.

func MakeUnexpectedTransmission added in v0.13.2

func MakeUnexpectedTransmission(s string, args ...any) *RadioTransmission

MakeUnexpectedTransmission similarly makes a single pilot transmission from the provided format string and arguments, but also marks the transmission as unexpected.

func RenderIntents added in v0.14.0

func RenderIntents(intents []CommandIntent, r *rand.Rand) *RadioTransmission

RenderIntents converts a slice of CommandIntents into a single coherent RadioTransmission. It handles merging related intents (e.g., altitude + expedite), PTACs, etc., for more realistic readbacks.

func (*RadioTransmission) Add added in v0.13.2

func (rt *RadioTransmission) Add(s string, args ...any)

Add is a convenience function to add a transmission snippet to the RadioTransmission. It's more or less equivalent to calling Merge(MakeRadioTransmission(...)).

func (*RadioTransmission) Merge added in v0.13.2

func (rt *RadioTransmission) Merge(r *RadioTransmission)

Merge takes a separately-constructed RadioTransmission and merges its contents with the current one.

func (RadioTransmission) Spoken added in v0.13.2

func (rt RadioTransmission) Spoken(r *rand.Rand) string

Spoken returns a string corresponding to how the transmission should be spoken, which appropriate phonetic substitutions made (e.g. "9" -> "niner").

func (*RadioTransmission) Validate added in v0.13.2

func (rt *RadioTransmission) Validate(lg *log.Logger)

Validate ensures that the types of arguments match with the formatting directives in the PhraseFormatStrings; errors are logged to the provided logger.

func (RadioTransmission) Written added in v0.13.2

func (rt RadioTransmission) Written(r *rand.Rand) string

Written returns a string corresponding to how the transmission should be displayed as text on the screen.

type RadioTransmissionType

type RadioTransmissionType int

func (RadioTransmissionType) String

func (r RadioTransmissionType) String() string

type ReportAltitudeIntent added in v0.14.0

type ReportAltitudeIntent struct {
	Current   float32
	Assigned  *float32
	Direction AltitudeDirection // if climbing/descending
}

ReportAltitudeIntent represents "say altitude" responses

func (ReportAltitudeIntent) Render added in v0.14.0

func (r ReportAltitudeIntent) Render(rt *RadioTransmission, rnd *rand.Rand)

type ReportHeadingIntent added in v0.14.0

type ReportHeadingIntent struct {
	Current  float32
	Assigned *float32
}

ReportHeadingIntent represents "say heading" responses

func (ReportHeadingIntent) Render added in v0.14.0

func (r ReportHeadingIntent) Render(rt *RadioTransmission, rnd *rand.Rand)

type ReportMachIntent added in v0.14.1

type ReportMachIntent struct {
	Current  float32  // current mach (e.g., 0.78)
	Assigned *float32 // assigned mach, if any
}

ReportMachIntent represents "say mach" or mach-regime "say speed" responses

func (ReportMachIntent) Render added in v0.14.1

func (r ReportMachIntent) Render(rt *RadioTransmission, rnd *rand.Rand)

type ReportSpeedIntent added in v0.14.0

type ReportSpeedIntent struct {
	Current  float32
	Assigned *float32
}

ReportSpeedIntent represents "say speed" responses (IAS)

func (ReportSpeedIntent) Render added in v0.14.0

func (r ReportSpeedIntent) Render(rt *RadioTransmission, rnd *rand.Rand)

type ReportingPoint

type ReportingPoint struct {
	Fix      string
	Location math.Point2LL
}

type RestrictionArea

type RestrictionArea struct {
	Title        string        `json:"title"`
	Text         [2]string     `json:"text"`
	BlinkingText bool          `json:"blinking_text"`
	HideId       bool          `json:"hide_id"`
	TextPosition math.Point2LL `json:"text_position"`
	CircleCenter math.Point2LL `json:"circle_center"`
	CircleRadius float32       `json:"circle_radius"`
	VerticesUser WaypointArray `json:"vertices"`
	Vertices     [][]math.Point2LL
	Closed       bool `json:"closed"`
	Shaded       bool `json:"shade_region"`
	Color        int  `json:"color"`

	Tris    [][3]math.Point2LL
	Deleted bool
}

func RestrictionAreaFromTFR

func RestrictionAreaFromTFR(tfr TFR) RestrictionArea

func (*RestrictionArea) AverageVertexPosition

func (ra *RestrictionArea) AverageVertexPosition() math.Point2LL

func (*RestrictionArea) MoveTo

func (ra *RestrictionArea) MoveTo(p math.Point2LL)

func (*RestrictionArea) UpdateTriangles

func (ra *RestrictionArea) UpdateTriangles()

type RouteGenerator

type RouteGenerator struct {
	// contains filtered or unexported fields
}

RouteGenerator is a utility class for describing lateral routes with respect to a local coordinate system. The user provides two points (generally the endpoints of a runway) which are then at (-1,0) and (1,0) in the coordinate system. The y axis is perpendicular to the vector between the two points and points to the left of it. (Thus, note that lengths in the two dimensions are different.)

func MakeRouteGenerator

func MakeRouteGenerator(p0ll, p1ll math.Point2LL, nmPerLongitude float32) RouteGenerator

func (RouteGenerator) Waypoint

func (rg RouteGenerator) Waypoint(name string, dx, dy float32) Waypoint

type Runway

type Runway struct {
	Id                         string
	Heading                    float32
	Threshold                  math.Point2LL
	ThresholdCrossingHeight    int // delta from elevation
	Elevation                  int
	DisplacedThresholdDistance float32 // in nm
}

func LookupOppositeRunway

func LookupOppositeRunway(icao, rwy string) (Runway, bool)

func LookupRunway

func LookupRunway(icao, rwy string) (Runway, bool)

type RunwayID added in v0.14.1

type RunwayID string

RunwayID is a runway identifier that may include a dot-separated suffix (e.g., "13R.All"). Use Base() for physical runway lookups/comparisons.

func (RunwayID) Base added in v0.14.1

func (r RunwayID) Base() string

func (RunwayID) SameRunway added in v0.14.1

func (r RunwayID) SameRunway(other RunwayID) bool

type RunwaySnippetFormatter added in v0.14.0

type RunwaySnippetFormatter struct{}

func (RunwaySnippetFormatter) Spoken added in v0.14.0

func (RunwaySnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (RunwaySnippetFormatter) Validate added in v0.14.0

func (RunwaySnippetFormatter) Validate(arg any) error

func (RunwaySnippetFormatter) Written added in v0.14.0

func (RunwaySnippetFormatter) Written(arg any) string

type SIDSnippetFormatter added in v0.13.2

type SIDSnippetFormatter struct{}

func (SIDSnippetFormatter) Spoken added in v0.13.2

func (SIDSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (SIDSnippetFormatter) Validate added in v0.13.2

func (SIDSnippetFormatter) Validate(arg any) error

func (SIDSnippetFormatter) Written added in v0.13.2

func (s SIDSnippetFormatter) Written(arg any) string

type SPC

type SPC struct {
	Squawk Squawk
	Code   string
}

SPC (Special Purpose Code) is a unique beacon code, indicate an emergency or non-standard operation.

type STAR

type STAR struct {
	Transitions     map[string]WaypointArray
	RunwayWaypoints map[string]WaypointArray
}

func MakeSTAR

func MakeSTAR() *STAR

func (STAR) Check

func (s STAR) Check(e *util.ErrorLogger)

func (STAR) Print

func (s STAR) Print(name string)

type STARSnippetFormatter added in v0.13.2

type STARSnippetFormatter struct{}

func (STARSnippetFormatter) Spoken added in v0.13.2

func (STARSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (STARSnippetFormatter) Validate added in v0.13.2

func (STARSnippetFormatter) Validate(arg any) error

func (STARSnippetFormatter) Written added in v0.13.2

func (s STARSnippetFormatter) Written(arg any) string

type SayAgainCommandType added in v0.14.0

type SayAgainCommandType int

SayAgainCommandType identifies which type of command the pilot is asking to be repeated.

const (
	SayAgainHeading SayAgainCommandType = iota
	SayAgainAltitude
	SayAgainSpeed
	SayAgainApproach
	SayAgainTurn
	SayAgainSquawk
	SayAgainFix
)

type SayAgainIntent added in v0.14.0

type SayAgainIntent struct {
	CommandType SayAgainCommandType
}

SayAgainIntent represents a pilot requesting the controller repeat part of a clearance. This is used when STT successfully identifies a command keyword but fails to parse the associated value (e.g., "fly heading blark bling five").

func (SayAgainIntent) Render added in v0.14.0

func (s SayAgainIntent) Render(rt *RadioTransmission, r *rand.Rand)

type SnippetFormatter added in v0.13.2

type SnippetFormatter interface {
	// Written
	Written(arg any) string
	Spoken(r *rand.Rand, arg any) string
	Validate(arg any) error
}

SnippetFormatter defines an interface for formatting short text snippets corresponding to various aviation-related concepts into both speech and text. Each is takes a single value specifying the value of the corresponding thing (altitude, speed, etc.)

type SpeedIntent added in v0.14.0

type SpeedIntent struct {
	Speed         float32
	Type          SpeedType
	AfterAltitude *float32    // speed change conditional on reaching this altitude
	Until         *SpeedUntil // what the speed restriction is "until"
	Mach          bool
}

SpeedIntent represents speed assignment commands

func (SpeedIntent) Render added in v0.14.0

func (s SpeedIntent) Render(rt *RadioTransmission, r *rand.Rand)

type SpeedSnippetFormatter added in v0.13.2

type SpeedSnippetFormatter struct{}

func (SpeedSnippetFormatter) Spoken added in v0.13.2

func (SpeedSnippetFormatter) Spoken(r *rand.Rand, arg any) string

func (SpeedSnippetFormatter) Validate added in v0.13.2

func (SpeedSnippetFormatter) Validate(arg any) error

func (SpeedSnippetFormatter) Written added in v0.13.2

func (SpeedSnippetFormatter) Written(arg any) string

type SpeedType added in v0.14.0

type SpeedType int
const (
	SpeedAssign SpeedType = iota
	SpeedReduce
	SpeedIncrease
	SpeedCancel
	SpeedSlowestPractical
	SpeedMaximumForward
	SpeedPresentSpeed
	SpeedUntilFinal // speed restriction until 5 mile final
)

type SpeedUntil added in v0.14.0

type SpeedUntil struct {
	Fix       string // fix name (e.g., "ROSLY")
	DME       int    // DME distance (e.g., 5 for "5 DME")
	MileFinal int    // mile final (e.g., 6 for "6 mile final")
}

SpeedUntil specifies when a speed restriction ends. Only one field should be set at a time.

type Squawk

type Squawk int

func ParseSquawk

func ParseSquawk(s string) (Squawk, error)

func ParseSquawkOrBlock

func ParseSquawkOrBlock(s string) (Squawk, error)

func (Squawk) IsSPC

func (sq Squawk) IsSPC() (ok bool, code string)

IsSPC returns true if the given squawk code is an SPC. The second return value is a string giving the two-letter abbreviated SPC it corresponds to.

func (Squawk) String

func (sq Squawk) String() string

type StaticDatabase

type StaticDatabase struct {
	Navaids             map[string]Navaid
	Airports            map[string]FAAAirport
	Fixes               map[string]Fix
	Airways             map[string][]Airway
	EnrouteHolds        map[string][]Hold            // Fix -> Holds
	TerminalHolds       map[string]map[string][]Hold // Airport ICAO -> Fix -> Holds
	Callsigns           map[string]string            // 3 letter -> callsign
	AircraftTypeAliases map[string]string
	AircraftPerformance map[string]AircraftPerformance
	Airlines            map[string]Airline
	MagneticGrid        MagneticGrid
	ARTCCs              map[string]ARTCC
	TRACONs             map[string]TRACON
	ATCTs               map[string]ATCT
	MVAs                map[string][]MVA // TRACON -> MVAs
	ERAMAdaptations     map[string]ERAMAdaptation
	BravoAirspace       map[string][]AirspaceVolume
	CharlieAirspace     map[string][]AirspaceVolume
	DeltaAirspace       map[string][]AirspaceVolume
}
var DB *StaticDatabase

func (StaticDatabase) IsARTCC added in v0.14.1

func (d StaticDatabase) IsARTCC(id string) bool

func (StaticDatabase) IsATCT added in v0.14.1

func (d StaticDatabase) IsATCT(id string) bool

func (StaticDatabase) IsFacility added in v0.14.0

func (d StaticDatabase) IsFacility(id string) bool

IsFacility returns true if id is a known ARTCC, TRACON, or ATCT.

func (StaticDatabase) IsTRACON added in v0.14.1

func (d StaticDatabase) IsTRACON(id string) bool

func (StaticDatabase) LookupAirport added in v0.13.3

func (d StaticDatabase) LookupAirport(name string) (FAAAirport, bool)

func (StaticDatabase) LookupFacility added in v0.14.0

func (d StaticDatabase) LookupFacility(id string) (Facility, bool)

LookupFacility returns a Facility for the given id, checking TRACONs, ATCTs, and ARTCCs.

func (StaticDatabase) LookupWaypoint

func (d StaticDatabase) LookupWaypoint(f string) (math.Point2LL, bool)

type TFR

type TFR struct {
	ARTCC     string
	Type      string // VIP, SECURITY, EVENT, etc.
	LocalName string // Short string summarizing it.
	Effective time.Time
	Expire    time.Time
	Points    [][]math.Point2LL // One or more line loops defining its extent.
}

TFR represents an FAA-issued temporary flight restriction.

type TFRCache

type TFRCache struct {
	TFRs map[string]TFR // URL -> TFR
	// contains filtered or unexported fields
}

TFRCache stores active TFRs that have been retrieved previously; we save it out on the config so that we don't download all of them each time vice is launched.

func MakeTFRCache

func MakeTFRCache() TFRCache

func (*TFRCache) Sync

func (t *TFRCache) Sync(timeout time.Duration, lg *log.Logger)

Sync synchronizes the cache, adding any newly-downloaded TFRs. It returns after the given timeout passes if we haven't gotten results back yet.

func (*TFRCache) TFRsForTRACON

func (t *TFRCache) TFRsForTRACON(tracon string, lg *log.Logger) []TFR

TFRsForTRACON returns all TFRs that apply to the given TRACON. (It currently return all of the ones for the TRACON's ARTCC, which is overkill; we should probably cull them based on distance to the center of the TRACON.)

func (*TFRCache) UpdateAsync

func (t *TFRCache) UpdateAsync(lg *log.Logger)

UpdateAsync kicks off an update of the TFRCache; it runs asynchronously with synchronization happening when Sync or TFRsForTRACON is called.

type TFRListJSON

type TFRListJSON struct {
	Notam_id string `json:"notam_id"`
}

type TRACON

type TRACON struct {
	Facility
	ARTCC string
}

TRACON represents a Terminal Radar Approach Control facility.

type TrafficAdvisoryIntent added in v0.14.0

type TrafficAdvisoryIntent struct {
	Response               TrafficAdvisoryResponse
	WillMaintainSeparation bool // If true, add "will maintain visual separation"
}

TrafficAdvisoryIntent represents a pilot's response to a traffic advisory

func (TrafficAdvisoryIntent) Render added in v0.14.0

type TrafficAdvisoryResponse added in v0.14.0

type TrafficAdvisoryResponse int

TrafficAdvisoryResponse represents the pilot's response to a traffic advisory

const (
	TrafficResponseIMC         TrafficAdvisoryResponse = iota // In IMC, can't see traffic
	TrafficResponseLooking                                    // No traffic visible, will look
	TrafficResponseTrafficSeen                                // Traffic is in sight
)

type TransponderIntent added in v0.14.0

type TransponderIntent struct {
	Code  *Squawk
	Mode  *TransponderMode
	Ident bool
}

TransponderIntent represents squawk/ident/mode commands

func (TransponderIntent) Render added in v0.14.0

func (t TransponderIntent) Render(rt *RadioTransmission, r *rand.Rand)

type TransponderMode

type TransponderMode int
const (
	TransponderModeStandby  TransponderMode = iota /* off */
	TransponderModeAltitude                        /* mode C */
	TransponderModeOn                              /* mode A */
)

func (TransponderMode) String

func (t TransponderMode) String() string

type TransponderType added in v0.14.0

type TransponderType int

type TurnDirection added in v0.13.0

type TurnDirection int

TurnDirection specifies the direction of a turn.

const (
	TurnClosest TurnDirection = iota // default: turn the shortest direction
	TurnLeft
	TurnRight
)

func (TurnDirection) String added in v0.13.0

func (t TurnDirection) String() string

type TypeOfFlight

type TypeOfFlight int
const (
	FlightTypeUnknown TypeOfFlight = iota
	FlightTypeDeparture
	FlightTypeArrival
	FlightTypeOverflight
)

type UnableIntent added in v0.14.0

type UnableIntent struct {
	Message string
	Args    []any
}

UnableIntent represents a pilot's "unable" response to a command. It is rendered as RadioTransmissionUnexpected and does not merge with other intents.

func MakeUnableIntent added in v0.14.0

func MakeUnableIntent(message string, args ...any) UnableIntent

func (UnableIntent) Render added in v0.14.0

func (u UnableIntent) Render(rt *RadioTransmission, r *rand.Rand)

type VFRRandomsSpec

type VFRRandomsSpec struct {
	Rate  int    `json:"rate"`
	Fleet string `json:"fleet"`
}

type VFRReportingPoint

type VFRReportingPoint struct {
	Description string        `json:"description"`
	Location    math.Point2LL `json:"location"`
}

func (*VFRReportingPoint) PostDeserialize

func (rp *VFRReportingPoint) PostDeserialize(loc Locator, controllers map[ControlPosition]*Controller, e *util.ErrorLogger)

type VFRRouteSpec

type VFRRouteSpec struct {
	Name        string        `json:"name"`
	Rate        int           `json:"rate"`
	Fleet       string        `json:"fleet"`
	Waypoints   WaypointArray `json:"waypoints"`
	Destination string        `json:"destination"`
	Description string        `json:"description"`
}

type VisualSeparationIntent added in v0.14.0

type VisualSeparationIntent struct{}

VisualSeparationIntent represents a pilot's acknowledgment of visual separation responsibility

func (VisualSeparationIntent) Render added in v0.14.0

type Waypoint

type Waypoint struct {
	Fix            string              `json:"fix"`
	Location       math.Point2LL       `json:"location,omitempty"`
	AltRestriction AltitudeRestriction // valid iff WaypointFlagHasAltRestriction set
	Extra          *WaypointExtra
	Flags          WaypointFlags
	Heading        int16 // 0 = unset
	Speed          int16 // 0 = unset
}

Waypoint is the core waypoint struct. Most waypoints only use Fix, Location, and a few flags; Extra fields are heap-allocated only when needed. AltRestriction, Heading, and Speed are inline because they are used by ~48% of waypoints, avoiding a heap allocation for those.

func AppendVFRLanding

func AppendVFRLanding(wps []Waypoint, perf AircraftPerformance, airport string, windDir float32, nmPerLongitude float32,
	magneticVariation float32, lg *log.Logger) []Waypoint

Takes waypoints up to the one with the Land specifier. Rewrite that one and then append the landing route.

func (Waypoint) Airway

func (wp Waypoint) Airway() string

func (Waypoint) AirworkMinutes

func (wp Waypoint) AirworkMinutes() int

func (Waypoint) AirworkRadius

func (wp Waypoint) AirworkRadius() int

func (*Waypoint) AltitudeRestriction

func (wp *Waypoint) AltitudeRestriction() *AltitudeRestriction

AltitudeRestriction returns a pointer to the inline restriction if the flag is set, else nil.

func (Waypoint) Arc

func (wp Waypoint) Arc() *DMEArc

func (Waypoint) ClearApproach

func (wp Waypoint) ClearApproach() bool

func (Waypoint) ClearPrimaryScratchpad

func (wp Waypoint) ClearPrimaryScratchpad() bool

func (Waypoint) ClearSecondaryScratchpad

func (wp Waypoint) ClearSecondaryScratchpad() bool

func (Waypoint) ClimbAltitude added in v0.13.0

func (wp Waypoint) ClimbAltitude() int

func (Waypoint) Delete

func (wp Waypoint) Delete() bool

func (Waypoint) DescendAltitude added in v0.13.0

func (wp Waypoint) DescendAltitude() int

func (*Waypoint) ETA

func (wp *Waypoint) ETA(p math.Point2LL, gs float32, nmPerLongitude float32) time.Duration

func (Waypoint) FAF

func (wp Waypoint) FAF() bool

func (Waypoint) FlyOver

func (wp Waypoint) FlyOver() bool

func (Waypoint) GoAroundContactController added in v0.14.1

func (wp Waypoint) GoAroundContactController() ControlPosition

func (Waypoint) HandoffController added in v0.13.3

func (wp Waypoint) HandoffController() ControlPosition

func (Waypoint) HumanHandoff

func (wp Waypoint) HumanHandoff() bool

func (Waypoint) IAF

func (wp Waypoint) IAF() bool

func (Waypoint) IF

func (wp Waypoint) IF() bool

func (*Waypoint) InitExtra added in v0.14.1

func (wp *Waypoint) InitExtra() *WaypointExtra

InitExtra allocates Extra if nil and returns it.

func (Waypoint) Land

func (wp Waypoint) Land() bool

func (Waypoint) LogValue

func (wp Waypoint) LogValue() slog.Value

func (Waypoint) NoPT

func (wp Waypoint) NoPT() bool

func (Waypoint) OnApproach

func (wp Waypoint) OnApproach() bool

func (Waypoint) OnSID

func (wp Waypoint) OnSID() bool

func (Waypoint) OnSTAR

func (wp Waypoint) OnSTAR() bool

func (Waypoint) PointOut

func (wp Waypoint) PointOut() ControlPosition

func (Waypoint) PresentHeading

func (wp Waypoint) PresentHeading() bool

Flag readers (value receiver)

func (Waypoint) PrimaryScratchpad

func (wp Waypoint) PrimaryScratchpad() string

func (Waypoint) ProcedureTurn

func (wp Waypoint) ProcedureTurn() *ProcedureTurn

Extra field readers (value receiver, nil-safe)

func (Waypoint) Radius

func (wp Waypoint) Radius() float32

func (Waypoint) SecondaryScratchpad

func (wp Waypoint) SecondaryScratchpad() string

func (*Waypoint) SetAltitudeRestriction added in v0.14.1

func (wp *Waypoint) SetAltitudeRestriction(ar AltitudeRestriction)

SetAltitudeRestriction stores the restriction inline and sets the flag.

func (*Waypoint) SetClearApproach added in v0.14.1

func (wp *Waypoint) SetClearApproach(v bool)

func (*Waypoint) SetClearPrimaryScratchpad added in v0.14.1

func (wp *Waypoint) SetClearPrimaryScratchpad(v bool)

func (*Waypoint) SetClearSecondaryScratchpad added in v0.14.1

func (wp *Waypoint) SetClearSecondaryScratchpad(v bool)

func (*Waypoint) SetDelete added in v0.14.1

func (wp *Waypoint) SetDelete(v bool)

func (*Waypoint) SetFAF added in v0.14.1

func (wp *Waypoint) SetFAF(v bool)

func (*Waypoint) SetFlyOver added in v0.14.1

func (wp *Waypoint) SetFlyOver(v bool)

func (*Waypoint) SetHumanHandoff added in v0.14.1

func (wp *Waypoint) SetHumanHandoff(v bool)

func (*Waypoint) SetIAF added in v0.14.1

func (wp *Waypoint) SetIAF(v bool)

func (*Waypoint) SetIF added in v0.14.1

func (wp *Waypoint) SetIF(v bool)

func (*Waypoint) SetLand added in v0.14.1

func (wp *Waypoint) SetLand(v bool)

func (*Waypoint) SetNoPT added in v0.14.1

func (wp *Waypoint) SetNoPT(v bool)

func (*Waypoint) SetOnApproach added in v0.14.1

func (wp *Waypoint) SetOnApproach(v bool)

func (*Waypoint) SetOnSID added in v0.14.1

func (wp *Waypoint) SetOnSID(v bool)

func (*Waypoint) SetOnSTAR added in v0.14.1

func (wp *Waypoint) SetOnSTAR(v bool)

func (*Waypoint) SetPresentHeading added in v0.14.1

func (wp *Waypoint) SetPresentHeading(v bool)

func (*Waypoint) SetTransferComms added in v0.14.1

func (wp *Waypoint) SetTransferComms(v bool)

func (*Waypoint) SetTurn added in v0.14.1

func (wp *Waypoint) SetTurn(t TurnDirection)

func (Waypoint) Shift

func (wp Waypoint) Shift() float32

func (Waypoint) TransferComms

func (wp Waypoint) TransferComms() bool

func (Waypoint) Turn added in v0.14.0

func (wp Waypoint) Turn() TurnDirection

type WaypointArray

type WaypointArray []Waypoint

func (WaypointArray) CheckArrival

func (wa WaypointArray) CheckArrival(e *util.ErrorLogger, ctrl map[ControlPosition]*Controller, approachAssigned bool,
	checkScratchpad func(string) bool)

func (WaypointArray) CheckDeparture

func (wa WaypointArray) CheckDeparture(e *util.ErrorLogger, controllers map[ControlPosition]*Controller, checkScratchpads func(string) bool)

func (WaypointArray) CheckOverflight

func (wa WaypointArray) CheckOverflight(e *util.ErrorLogger, ctrl map[ControlPosition]*Controller, checkScratchpads func(string) bool)

func (WaypointArray) Encode

func (wa WaypointArray) Encode() string

func (WaypointArray) HasHumanHandoff added in v0.13.3

func (wa WaypointArray) HasHumanHandoff() bool

HasHumanHandoff returns true if any waypoint has HumanHandoff set.

func (WaypointArray) InitializeLocations

func (wa WaypointArray) InitializeLocations(loc Locator, nmPerLongitude float32, magneticVariation float32,
	allowSlop bool, e *util.ErrorLogger) WaypointArray

func (WaypointArray) RouteString

func (wa WaypointArray) RouteString() string

func (*WaypointArray) UnmarshalJSON

func (wa *WaypointArray) UnmarshalJSON(b []byte) error

type WaypointExtra added in v0.14.1

type WaypointExtra struct {
	ProcedureTurn             *ProcedureTurn
	Arc                       *DMEArc
	HandoffController         ControlPosition
	PointOut                  ControlPosition
	GoAroundContactController ControlPosition
	Airway                    string
	PrimaryScratchpad         string
	SecondaryScratchpad       string
	Radius                    float32
	Shift                     float32
	ClimbAltitude             int16 // hundreds of feet; 0 = unset
	DescendAltitude           int16 // hundreds of feet; 0 = unset
	AirworkRadius             int8
	AirworkMinutes            int8
}

WaypointExtra holds the rarely-used fields, heap-allocated only when needed.

type WaypointFlags added in v0.14.1

type WaypointFlags uint32
const (
	WaypointFlagPresentHeading WaypointFlags = 1 << iota
	WaypointFlagNoPT
	WaypointFlagHumanHandoff
	WaypointFlagClearApproach
	WaypointFlagFlyOver
	WaypointFlagDelete
	WaypointFlagLand
	WaypointFlagIAF
	WaypointFlagIF
	WaypointFlagFAF
	WaypointFlagOnSID
	WaypointFlagOnSTAR
	WaypointFlagOnApproach
	WaypointFlagClearPrimaryScratchpad
	WaypointFlagClearSecondaryScratchpad
	WaypointFlagTransferComms
	WaypointFlagTurnLeft
	WaypointFlagTurnRight
	WaypointFlagHasAltRestriction
)

type XNOTAMUpdate

type XNOTAMUpdate struct {
	Group struct {
		Add struct {
			Not struct {
				NotUid struct {
					TxtLocalName string `xml:"txtLocalName"`
				} `xml:"NotUid"`
				DateEffective          string `xml:"dateEffective"`
				DateExpire             string `xml:"dateExpire"`
				CodeTimeZone           string `xml:"codeTimeZone"`
				CodeExpirationTimeZone string `xml:"codeExpirationTimeZone"`
				CodeFacility           string `xml:"codeFacility"`
				TfrNot                 struct {
					CodeType     string `xml:"codeType"`
					TFRAreaGroup []struct {
						AbdMergedArea struct {
							Avx []struct {
								Text      string `xml:",chardata"`
								CodeDatum string `xml:"codeDatum"`
								CodeType  string `xml:"codeType"`
								GeoLat    string `xml:"geoLat"`
								GeoLong   string `xml:"geoLong"`
							} `xml:"Avx"`
						} `xml:"abdMergedArea"`
					} `xml:"TFRAreaGroup"`
				} `xml:"TfrNot"`
			} `xml:"Not"`
		} `xml:"Add"`
	} `xml:"Group"`
}

XNOTAMUpdate was generated 2024-09-23 07:39:34 by https://xml-to-go.github.io/, using https://github.com/miku/zek. Then manually chopped down to the parts we care about...

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL