aviation

package
v0.12.0 Latest Latest
Warning

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

Go to latest
Published: May 27, 2025 License: GPL-3.0 Imports: 31 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RadioTransmissionContact    = iota // Messages initiated by the pilot
	RadioTransmissionReadback          // Reading back an instruction
	RadioTransmissionUnexpected        // Something urgent or unusual
)
View Source
const (
	RouteBasedFix = "route"
	ZoneBasedFix  = "zone"
)
View Source
const (
	PTStateApproaching = iota
	PTStateTurningOutbound
	PTStateFlyingOutbound
	PTStateTurningInbound
	PTStateFlyingInbound // parallel entry only
)
View Source
const (
	PT45StateApproaching = iota
	PT45StateTurningOutbound
	PT45StateFlyingOutbound
	PT45StateTurningAway
	PT45StateFlyingAway
	PT45StateTurningIn
	PT45StateFlyingIn
	PT45StateTurningToIntercept
)
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 MaxIAS = 290
View Source
const MaxRestrictionAreas = 100

This many adapted and then this many user-defined

View Source
const MaximumRate = 100000
View Source
const StandardTurnRate = 3

Variables

View Source
var (
	ErrClearedForUnexpectedApproach = errors.New("Cleared for unexpected approach")
	ErrFixIsTooFarAway              = errors.New("Fix is too far away")
	ErrFixNotInRoute                = errors.New("Fix not in aircraft's route")
	ErrInvalidAltitude              = errors.New("Altitude above aircraft's ceiling")
	ErrInvalidApproach              = errors.New("Invalid approach")
	ErrInvalidController            = errors.New("Invalid controller")
	ErrInvalidFacility              = errors.New("Invalid facility")
	ErrInvalidFix                   = errors.New("Invalid fix")
	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")
	ErrNotClearedForApproach        = errors.New("Aircraft has not been cleared for an approach")
	ErrNotFlyingRoute               = errors.New("Aircraft is not currently flying its assigned route")
	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")
	ErrUnableCommand                = errors.New("Unable")
	ErrUnknownAircraftType          = errors.New("Unknown aircraft type")
	ErrUnknownAirport               = errors.New("Unknown airport")
	ErrUnknownApproach              = errors.New("Unknown approach")
	ErrUnknownRunway                = errors.New("Unknown runway")
)

Functions

func CWTApproachSeparation added in v0.11.5

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 added in v0.11.5

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 CheckApproaches added in v0.11.8

func CheckApproaches(e *util.ErrorLogger, wps []WaypointArray, requireFAF bool, controllers map[string]*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 FixReadback

func FixReadback(fix string) string

func FormatAltitude

func FormatAltitude(falt float32) string

func IASToTAS

func IASToTAS(ias, altitude float32) float32

func InAirspace added in v0.11.9

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

func InBravoAirspace added in v0.12.0

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

func InCharlieAirspace added in v0.12.0

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

func InDeltaAirspace added in v0.12.0

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

func ParseARINC424

func ParseARINC424(r io.Reader) (map[string]FAAAirport, map[string]Navaid, map[string]Fix, map[string][]Airway)

func PlausibleFinalAltitude

func PlausibleFinalAltitude(fp FlightPlan, perf AircraftPerformance, nmPerLongitude float32, magneticVariation float32, r *rand.Rand) int

func PrintCIFPRoutes

func PrintCIFPRoutes(airport string) error

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 TidyRunway added in v0.11.9

func TidyRunway(r string) string

func TurnAngle

func TurnAngle(from, to float32, turn TurnMethod) float32

Types

type ADSBCallsign added in v0.12.0

type ADSBCallsign string

func (ADSBCallsign) String added in v0.12.0

func (c ADSBCallsign) String() string

type ARTCC

type ARTCC struct {
	Name string
}

type ATIS

type ATIS struct {
	Airport  string
	AppDep   string
	Code     string
	Contents string
}

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 Aircraft

type Aircraft struct {
	// This is ADS-B callsign of the aircraft. Just because different the
	// callsign in the flight plan can be different across multiple STARS
	// facilities, so two different facilities can show different
	// callsigns; however, the ADS-B callsign is transmitted from the
	// aircraft and would be the same to all facilities.
	ADSBCallsign ADSBCallsign

	Squawk Squawk
	Mode   TransponderMode

	IdentStartTime, IdentEndTime time.Time

	FlightPlan   FlightPlan
	TypeOfFlight TypeOfFlight

	Strip FlightStrip

	// State related to navigation.
	Nav Nav

	// Arrival-related state
	STAR                string
	STARRunwayWaypoints map[string]WaypointArray
	GotContactTower     bool
}

func (*Aircraft) ATPAVolume

func (ac *Aircraft) ATPAVolume() *ATPAVolume

func (*Aircraft) AircraftPerformance

func (ac *Aircraft) AircraftPerformance() AircraftPerformance

func (*Aircraft) Altitude

func (ac *Aircraft) Altitude() float32

func (*Aircraft) AltitudeOurDiscretion added in v0.12.0

func (ac *Aircraft) AltitudeOurDiscretion() []RadioTransmission

func (*Aircraft) ArrivalAirportElevation

func (ac *Aircraft) ArrivalAirportElevation() float32

func (*Aircraft) ArrivalAirportLocation added in v0.11.2

func (ac *Aircraft) ArrivalAirportLocation() math.Point2LL

func (*Aircraft) AssignAltitude

func (ac *Aircraft) AssignAltitude(altitude int, afterSpeed bool) []RadioTransmission

func (*Aircraft) AssignHeading

func (ac *Aircraft) AssignHeading(heading int, turn TurnMethod) []RadioTransmission

func (*Aircraft) AssignSpeed

func (ac *Aircraft) AssignSpeed(speed int, afterAltitude bool) []RadioTransmission

func (*Aircraft) AssignedApproach added in v0.11.7

func (ac *Aircraft) AssignedApproach() string

func (*Aircraft) AtFixCleared

func (ac *Aircraft) AtFixCleared(fix, approach string) []RadioTransmission

func (*Aircraft) CWT added in v0.11.5

func (ac *Aircraft) CWT() string

func (*Aircraft) CancelApproachClearance

func (ac *Aircraft) CancelApproachClearance() []RadioTransmission

func (*Aircraft) Check

func (ac *Aircraft) Check(lg *log.Logger)

func (*Aircraft) ClearedApproach

func (ac *Aircraft) ClearedApproach(id string, lg *log.Logger) ([]RadioTransmission, error)

func (*Aircraft) ClearedStraightInApproach

func (ac *Aircraft) ClearedStraightInApproach(id string, lg *log.Logger) ([]RadioTransmission, error)

func (*Aircraft) ClimbViaSID

func (ac *Aircraft) ClimbViaSID() []RadioTransmission

func (*Aircraft) ContactMessage

func (ac *Aircraft) ContactMessage(reportingPoints []ReportingPoint) string

func (*Aircraft) ContactTower

func (ac *Aircraft) ContactTower(lg *log.Logger) []RadioTransmission

func (*Aircraft) CrossFixAt

func (ac *Aircraft) CrossFixAt(fix string, ar *AltitudeRestriction, speed int) []RadioTransmission

func (*Aircraft) DepartFixDirect

func (ac *Aircraft) DepartFixDirect(fixa, fixb string) []RadioTransmission

func (*Aircraft) DepartFixHeading

func (ac *Aircraft) DepartFixHeading(fix string, hdg int) []RadioTransmission

func (*Aircraft) DepartOnCourse

func (ac *Aircraft) DepartOnCourse(lg *log.Logger)

func (*Aircraft) DepartureAirportElevation

func (ac *Aircraft) DepartureAirportElevation() float32

func (*Aircraft) DepartureAirportLocation added in v0.11.2

func (ac *Aircraft) DepartureAirportLocation() math.Point2LL

func (*Aircraft) DescendViaSTAR

func (ac *Aircraft) DescendViaSTAR() []RadioTransmission

func (*Aircraft) DirectFix

func (ac *Aircraft) DirectFix(fix string) []RadioTransmission

func (*Aircraft) DistanceAlongRoute

func (ac *Aircraft) DistanceAlongRoute(fix string) (float32, error)

func (*Aircraft) DistanceToEndOfApproach

func (ac *Aircraft) DistanceToEndOfApproach() (float32, error)

func (*Aircraft) ExpectApproach

func (ac *Aircraft) ExpectApproach(id string, ap *Airport, lg *log.Logger) []RadioTransmission

func (*Aircraft) ExpediteClimb

func (ac *Aircraft) ExpediteClimb() []RadioTransmission

func (*Aircraft) ExpediteDescent

func (ac *Aircraft) ExpediteDescent() []RadioTransmission

func (*Aircraft) FlyPresentHeading

func (ac *Aircraft) FlyPresentHeading() []RadioTransmission

func (*Aircraft) GS

func (ac *Aircraft) GS() float32

func (*Aircraft) GetRadarTrack added in v0.12.0

func (ac *Aircraft) GetRadarTrack(now time.Time) RadarTrack

func (*Aircraft) GoAround

func (ac *Aircraft) GoAround() []RadioTransmission

func (*Aircraft) Heading

func (ac *Aircraft) Heading() float32

func (*Aircraft) IAS

func (ac *Aircraft) IAS() float32

func (*Aircraft) Ident added in v0.12.0

func (ac *Aircraft) Ident(now time.Time) []RadioTransmission

func (*Aircraft) InitializeArrival

func (ac *Aircraft) InitializeArrival(ap *Airport, arr *Arrival, nmPerLongitude float32, magneticVariation float32,
	wind WindModel, now time.Time, lg *log.Logger) error

func (*Aircraft) InitializeDeparture

func (ac *Aircraft) InitializeDeparture(ap *Airport, departureAirport string, dep *Departure,
	runway string, exitRoute ExitRoute, nmPerLongitude float32, magneticVariation float32,
	wind WindModel, now time.Time, lg *log.Logger) error

func (*Aircraft) InitializeFlightPlan added in v0.12.0

func (ac *Aircraft) InitializeFlightPlan(r FlightRules, acType, dep, arr string)

func (*Aircraft) InitializeOverflight added in v0.11.2

func (ac *Aircraft) InitializeOverflight(of *Overflight, nmPerLongitude float32,
	magneticVariation float32, wind WindModel, now time.Time, lg *log.Logger) error

func (*Aircraft) InitializeVFRDeparture added in v0.11.9

func (ac *Aircraft) InitializeVFRDeparture(ap *Airport, wps WaypointArray,
	randomizeAltitudeRange bool, nmPerLongitude float32, magneticVariation float32, wind WindModel,
	lg *log.Logger) error

func (*Aircraft) InterceptApproach added in v0.11.8

func (ac *Aircraft) InterceptApproach(lg *log.Logger) []RadioTransmission

func (*Aircraft) IsAirborne

func (ac *Aircraft) IsAirborne() bool

func (*Aircraft) IsArrival added in v0.12.0

func (ac *Aircraft) IsArrival() bool

func (*Aircraft) IsDeparture

func (ac *Aircraft) IsDeparture() bool

func (*Aircraft) IsOverflight added in v0.12.0

func (ac *Aircraft) IsOverflight() bool

func (*Aircraft) MVAsApply

func (ac *Aircraft) MVAsApply() bool

func (*Aircraft) MagneticVariation

func (ac *Aircraft) MagneticVariation() float32

func (*Aircraft) MaintainMaximumForward

func (ac *Aircraft) MaintainMaximumForward() []RadioTransmission

func (*Aircraft) MaintainSlowestPractical

func (ac *Aircraft) MaintainSlowestPractical() []RadioTransmission

func (*Aircraft) NavSummary

func (ac *Aircraft) NavSummary(lg *log.Logger) string

func (*Aircraft) NmPerLongitude

func (ac *Aircraft) NmPerLongitude() float32

func (*Aircraft) OnApproach

func (ac *Aircraft) OnApproach(checkAltitude bool) bool

func (*Aircraft) OnExtendedCenterline

func (ac *Aircraft) OnExtendedCenterline(maxNmDeviation float32) bool

func (*Aircraft) Position

func (ac *Aircraft) Position() math.Point2LL

func (*Aircraft) ResumeOwnNavigation added in v0.12.0

func (ac *Aircraft) ResumeOwnNavigation() []RadioTransmission

func (*Aircraft) RouteIncludesFix

func (ac *Aircraft) RouteIncludesFix(fix string) bool

func (*Aircraft) SayAltitude

func (ac *Aircraft) SayAltitude() []RadioTransmission

func (*Aircraft) SayHeading

func (ac *Aircraft) SayHeading() []RadioTransmission

func (*Aircraft) SaySpeed

func (ac *Aircraft) SaySpeed() []RadioTransmission

func (*Aircraft) TAS

func (ac *Aircraft) TAS() float32

func (*Aircraft) TurnLeft

func (ac *Aircraft) TurnLeft(deg int) []RadioTransmission

func (*Aircraft) TurnRight

func (ac *Aircraft) TurnRight(deg int) []RadioTransmission

func (*Aircraft) Update

func (ac *Aircraft) Update(wind WindModel, lg *log.Logger) *Waypoint

func (*Aircraft) Waypoints

func (ac *Aircraft) Waypoints() []Waypoint

func (*Aircraft) WillDoAirwork added in v0.12.0

func (ac *Aircraft) WillDoAirwork() bool

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"`
}

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]interface{} `json:"fleets"`
	Fleets     map[string][]FleetAircraft
}

type AirlineSpecifier added in v0.11.5

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

func (AirlineSpecifier) Aircraft added in v0.11.5

func (a AirlineSpecifier) Aircraft() []FleetAircraft

func (*AirlineSpecifier) Check added in v0.11.5

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

func (AirlineSpecifier) SampleAcTypeAndCallsign added in v0.12.0

func (a AirlineSpecifier) SampleAcTypeAndCallsign(r *rand.Rand, checkCallsign func(s string) bool, lg *log.Logger) (actype, callsign string)

type Airport

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

	Name string `json:"name"`

	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 string `json:"departure_controller"`
	HoldForRelease      bool   `json:"hold_for_release"`

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

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

	ApproachRegions   map[string]*ApproachRegion `json:"approach_regions"`
	ConvergingRunways []ConvergingRunways        `json:"converging_runways"`

	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[string]*Controller, scratchpads map[string]string,
	facilityAirports map[string]*Airport, checkScratchpad func(string) bool, e *util.ErrorLogger)

func (Airport) VFRRateSum added in v0.11.9

func (ap Airport) VFRRateSum() int

type Airspace added in v0.11.9

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

type AirspaceGrid added in v0.11.9

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 added in v0.11.9

func MakeAirspaceGrid(v []*AirspaceVolume) *AirspaceGrid

func (*AirspaceGrid) Inside added in v0.11.9

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) GenerateDrawCommands

func (a *AirspaceVolume) GenerateDrawCommands(cb *renderer.CommandBuffer, nmPerLongitude float32)

func (*AirspaceVolume) Inside

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

func (*AirspaceVolume) PostDeserialize added in v0.12.0

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 added in v0.11.1

type Airway struct {
	Name  string
	Fixes []AirwayFix
}

func (Airway) WaypointsBetween added in v0.11.1

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

type AirwayDirection added in v0.11.1

type AirwayDirection int

type AirwayFix added in v0.11.1

type AirwayFix struct {
	Fix       string
	Level     AirwayLevel
	Direction AirwayDirection
}

type AirwayLevel added in v0.11.1

type AirwayLevel int

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) Summary

func (a AltitudeRestriction) Summary() string

Summary returns a human-readable summary of the altitude restriction.

func (AltitudeRestriction) TargetAltitude

func (a AltitudeRestriction) TargetAltitude(alt float32) float32

func (*AltitudeRestriction) UnmarshalJSON

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

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"`
	// Note: this isn't currently documented; currently it's only set when
	// we have a canonical value from the CIFP.
	ApproachHeading float32 `json:"approach_heading"`
}

func (*Approach) FAFSegment added in v0.11.8

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) Heading

func (ap *Approach) Heading(nmPerLongitude, magneticVariation float32) (float32, bool)

func (*Approach) Line

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

type ApproachRegion

type ApproachRegion struct {
	Runway           string  // set during deserialization
	HeadingTolerance float32 `json:"heading_tolerance"`

	ReferenceLineHeading   float32       `json:"reference_heading"`
	ReferenceLineLength    float32       `json:"reference_length"`
	ReferencePointAltitude float32       `json:"reference_altitude"`
	ReferencePoint         math.Point2LL `json:"reference_point"`

	// 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"`
}

func (*ApproachRegion) FarPoint

func (ar *ApproachRegion) FarPoint(nmPerLongitude, magneticVariation float32) [2]float32

func (*ApproachRegion) GetLateralGeometry

func (ar *ApproachRegion) GetLateralGeometry(nmPerLongitude, magneticVariation float32) (line [2]math.Point2LL, quad [4]math.Point2LL)

func (*ApproachRegion) Inside

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

func (*ApproachRegion) NearPoint

func (ar *ApproachRegion) NearPoint(nmPerLongitude, magneticVariation float32) [2]float32

func (*ApproachRegion) TryMakeGhost

func (ar *ApproachRegion) TryMakeGhost(trk RadarTrack, heading float32,
	scratchpad string, forceGhost bool, offset float32, leaderDirection math.CardinalOrdinalDirection,
	runwayIntersection [2]float32, nmPerLongitude float32, magneticVariation float32, other *ApproachRegion) *GhostTrack

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   string  `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"`

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

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

func (Arrival) GetRunwayWaypoints

func (a 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[string]*Controller, checkScratchpad func(string) bool,
	e *util.ErrorLogger)

type ArrivalAirline

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

type BeaconCodeTable added in v0.12.0

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

type BeaconCodeTableSpecifier added in v0.12.0

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

}

type Controller

type Controller struct {
	Position           string    // This is the key in the controllers map in JSON
	RadioName          string    `json:"radio_name"`
	Frequency          Frequency `json:"frequency"`
	TCP                string    `json:"sector_id"`       // e.g. N56, 2J, ...
	Scope              string    `json:"scope_char"`      // Optional. If unset, facility id is used for external, last char of sector id for local.
	FacilityIdentifier string    `json:"facility_id"`     // For example the "N" in "N4P" showing the N90 TRACON
	ERAMFacility       bool      `json:"eram_facility"`   // To weed out N56 and N4P being the same fac
	Facility           string    `json:"facility"`        // So we can get the STARS facility from a controller
	DefaultAirport     string    `json:"default_airport"` // only required if CRDA is a thing
}

func (Controller) Id added in v0.11.7

func (c Controller) Id() string

func (Controller) IsExternal added in v0.12.0

func (c Controller) IsExternal() bool

type ControllerAirspaceVolume added in v0.11.9

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 ConvergingRunways

type ConvergingRunways struct {
	Runways                [2]string                        `json:"runways"`
	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
	RunwayIntersection     math.Point2LL                    // not in JSON, set during deserialize
}

type DMEArc

type DMEArc struct {
	Fix            string
	Center         math.Point2LL
	Radius         float32
	Length         float32
	InitialHeading float32
	Clockwise      bool
}

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

type DeferredHeading

type DeferredHeading struct {
	// Time is just plain old wallclock time; it should be sim time, but a
	// lot of replumbing would be required to have that available where
	// needed. The downsides are minor: 1. On quit and resume, any pending
	// assignments will generally be followed immediately, and 2. if the
	// sim rate is increased, the delay will end up being longer than
	// intended.
	Time    time.Time
	Heading NavHeading
}

DeferredHeading stores a heading assignment from the controller and the time at which to start executing it; this time is set to be a few seconds after the controller issues it in order to model the delay before pilots start to follow assignments.

type Departure

type Departure struct {
	Exit string `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 added in v0.12.0

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 added in v0.12.0

func MakeEnrouteSquawkCodePool(loc *LocalSquawkCodePool) *EnrouteSquawkCodePool

func (*EnrouteSquawkCodePool) Get added in v0.12.0

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

func (*EnrouteSquawkCodePool) IsAssigned added in v0.12.0

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

func (*EnrouteSquawkCodePool) NumAvailable added in v0.12.0

func (p *EnrouteSquawkCodePool) NumAvailable() int

func (*EnrouteSquawkCodePool) Return added in v0.12.0

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

func (*EnrouteSquawkCodePool) Take added in v0.12.0

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

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"`
	// optional, control position to handoff to at a /ho
	HandoffController string `json:"handoff_controller"`
}

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 added in v0.11.9

func (ap FAAAirport) SelectBestRunway(wind WindModel, magneticVariation float32) (*Runway, *Runway)

func (FAAAirport) ValidRunways

func (ap FAAAirport) ValidRunways() string

type Fix

type Fix struct {
	Id       string
	Location math.Point2LL
}

type FleetAircraft

type FleetAircraft struct {
	ICAO  string
	Count int
}

type FlightPlan

type FlightPlan struct {
	Rules            FlightRules
	AircraftType     string
	CruiseSpeed      int
	DepartureAirport string
	Altitude         int
	ArrivalAirport   string
	AlternateAirport string
	Exit             string
	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 FlightState

type FlightState struct {
	InitialDepartureClimb     bool
	DepartureAirportLocation  math.Point2LL
	DepartureAirportElevation float32
	ArrivalAirport            Waypoint
	ArrivalAirportLocation    math.Point2LL
	ArrivalAirportElevation   float32

	MagneticVariation float32
	NmPerLongitude    float32

	Position math.Point2LL
	Heading  float32
	Altitude float32
	IAS, GS  float32 // speeds...
}

func (FlightState) LogValue

func (fs FlightState) LogValue() slog.Value

func (*FlightState) Summary

func (fs *FlightState) Summary() string

type FlightStrip

type FlightStrip struct {
	Callsign string
}

type FlyRacetrackPT

type FlyRacetrackPT struct {
	ProcedureTurn      *ProcedureTurn
	Fix                string
	FixLocation        math.Point2LL
	Entry              RacetrackPTEntry
	InboundHeading     float32
	OutboundHeading    float32
	OutboundTurnRate   float32
	OutboundTurnMethod TurnMethod
	OutboundLegLength  float32
	State              int
}

func MakeFlyRacetrackPT

func MakeFlyRacetrackPT(nav *Nav, wp []Waypoint) *FlyRacetrackPT

func (*FlyRacetrackPT) GetAltitude

func (fp *FlyRacetrackPT) GetAltitude(nav *Nav) (float32, bool)

func (*FlyRacetrackPT) GetHeading

func (fp *FlyRacetrackPT) GetHeading(nav *Nav, wind WindModel, lg *log.Logger) (float32, TurnMethod, float32)

type FlyStandard45PT

type FlyStandard45PT struct {
	ProcedureTurn    *ProcedureTurn
	Fix              string
	FixLocation      math.Point2LL
	InboundHeading   float32 // fix->airport
	AwayHeading      float32 // outbound + 45 offset
	State            int
	SecondsRemaining int
}

func MakeFlyStandard45PT

func MakeFlyStandard45PT(nav *Nav, wp []Waypoint) *FlyStandard45PT

func (*FlyStandard45PT) GetHeading

func (fp *FlyStandard45PT) GetHeading(nav *Nav, wind WindModel, lg *log.Logger) (float32, TurnMethod, float32)

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 GhostTrack added in v0.12.0

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

type InboundFlow added in v0.11.9

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

type InterceptState added in v0.11.8

type InterceptState int
const (
	NotIntercepting InterceptState = iota
	InitialHeading
	TurningToJoin
	OnApproachCourse
)

type LocalPool added in v0.12.0

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

type LocalSquawkCodePool added in v0.12.0

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

func MakeLocalSquawkCodePool added in v0.12.0

func MakeLocalSquawkCodePool(spec LocalSquawkCodePoolSpecifier) *LocalSquawkCodePool

func (*LocalSquawkCodePool) Get added in v0.12.0

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) IsReservedVFRCode added in v0.12.0

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

func (*LocalSquawkCodePool) Return added in v0.12.0

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

type LocalSquawkCodePoolSpecifier added in v0.12.0

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

SSR Codes Windows

func (*LocalSquawkCodePoolSpecifier) PostDeserialize added in v0.12.0

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 METAR

type METAR struct {
	AirportICAO string
	Time        string
	Auto        bool
	Wind        Wind `json:"wind"` // WAR changing this from a strong to deserialization doesn't fail.
	Altimeter   string
	Weather     string
	Rmk         string
}

func GetWeather added in v0.11.9

func GetWeather(icao ...string) ([]METAR, error)

func (METAR) String

func (m METAR) String() string

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 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 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 MultiUserController

type MultiUserController struct {
	Primary          bool     `json:"primary"`
	BackupController string   `json:"backup"`
	Departures       []string `json:"departures"`
	Arrivals         []string `json:"arrivals"` // TEMPORARY for inbound flows transition
	InboundFlows     []string `json:"inbound_flows"`
}

func (*MultiUserController) IsDepartureController

func (c *MultiUserController) IsDepartureController(ap, rwy, sid string) bool

func (*MultiUserController) IsInboundController added in v0.11.2

func (c *MultiUserController) IsInboundController(group string) bool
type Nav struct {
	FlightState FlightState
	Perf        AircraftPerformance
	Altitude    NavAltitude
	Speed       NavSpeed
	Heading     NavHeading
	Approach    NavApproach
	Airwork     *NavAirwork

	FixAssignments map[string]NavFixAssignment

	// DeferredHeading stores a heading assignment from the controller that
	// the pilot has not yet started to follow.  Note that only a single
	// such assignment is stored; if the controller issues a first heading
	// and then a second shortly afterward, before the first has been
	// followed, it's fine for the second to override it.
	DeferredHeading *DeferredHeading

	FinalAltitude float32
	Waypoints     WaypointArray

	Rand *rand.Rand
}

State related to navigation. Pointers are used for optional values; nil -> unset/unspecified.

func MakeArrivalNav

func MakeArrivalNav(callsign ADSBCallsign, arr *Arrival, fp FlightPlan, perf AircraftPerformance,
	nmPerLongitude float32, magneticVariation float32, wind WindModel, lg *log.Logger) *Nav

func MakeDepartureNav

func MakeDepartureNav(callsign ADSBCallsign, fp FlightPlan, perf AircraftPerformance,
	assignedAlt, clearedAlt, speedRestriction int, wp []Waypoint, randomizeAltitudeRange bool,
	nmPerLongitude float32, magneticVariation float32, wind WindModel, lg *log.Logger) *Nav

func MakeOverflightNav added in v0.11.2

func MakeOverflightNav(callsign ADSBCallsign, of *Overflight, fp FlightPlan, perf AircraftPerformance,
	nmPerLongitude float32, magneticVariation float32, wind WindModel, lg *log.Logger) *Nav
func (nav *Nav) AltitudeOurDiscretion() PilotResponse
func (nav *Nav) ApproachHeading(wind WindModel, lg *log.Logger) (heading float32, turn TurnMethod, rate float32)
func (nav *Nav) AssignAltitude(alt float32, afterSpeed bool) PilotResponse
func (nav *Nav) AssignHeading(hdg float32, turn TurnMethod) PilotResponse
func (nav *Nav) AssignSpeed(speed float32, afterAltitude bool) PilotResponse
func (nav *Nav) AssignedHeading() (float32, bool)

AssignedHeading returns the aircraft's current heading assignment, if any, regardless of whether the pilot has yet started following it.

func (nav *Nav) AtFixCleared(fix, id string) PilotResponse
func (nav *Nav) CancelApproachClearance() PilotResponse
func (nav *Nav) Check(lg *log.Logger)
func (nav *Nav) ClimbViaSID() PilotResponse
func (nav *Nav) ContactMessage(reportingPoints []ReportingPoint, star string) string
func (nav *Nav) CrossFixAt(fix string, ar *AltitudeRestriction, speed int) PilotResponse
func (nav *Nav) DepartFixDirect(fixa string, fixb string) PilotResponse
func (nav *Nav) DepartFixHeading(fix string, hdg float32) PilotResponse
func (nav *Nav) DepartOnCourse(alt float32, exit string)
func (nav *Nav) DepartureMessage() string
func (nav *Nav) DescendViaSTAR() PilotResponse
func (nav *Nav) DirectFix(fix string) PilotResponse
func (nav *Nav) DistanceAlongRoute(fix string) (float32, error)
func (nav *Nav) EnqueueHeading(h NavHeading)

EnqueueHeading enqueues the given heading assignment to be followed a few seconds in the future. It should only be called for heading changes due to controller instructions to the pilot and never in cases where the autopilot is changing the heading assignment.

func (nav *Nav) ExpectApproach(airport *Airport, id string, runwayWaypoints map[string]WaypointArray,
	lg *log.Logger) PilotResponse
func (nav *Nav) ExpediteClimb() PilotResponse
func (nav *Nav) ExpediteDescent() PilotResponse
func (nav *Nav) FlyPresentHeading() PilotResponse
func (nav *Nav) GoAround() PilotResponse
func (nav *Nav) InterceptApproach(airport string, lg *log.Logger) PilotResponse
func (nav *Nav) InterceptedButNotCleared() bool
func (nav *Nav) IsAirborne() bool
func (nav *Nav) MaintainMaximumForward() PilotResponse
func (nav *Nav) MaintainSlowestPractical() PilotResponse
func (nav *Nav) OnApproach(checkAltitude bool) bool
func (nav *Nav) OnExtendedCenterline(maxNmDeviation float32) bool

OnExtendedCenterline checks if the flight position is less than maxNmDeviation from the infinite line defined by the assigned approach localizer

func (nav *Nav) ResumeOwnNavigation() PilotResponse
func (nav *Nav) SayAltitude() PilotResponse
func (nav *Nav) SayHeading() PilotResponse
func (nav *Nav) SaySpeed() PilotResponse
func (nav *Nav) Summary(fp FlightPlan, lg *log.Logger) string

Full human-readable summary of nav state for use when paused and mouse hover on the scope

func (nav *Nav) TAS() float32
func (nav *Nav) TargetAltitude(lg *log.Logger) (float32, float32)
func (nav *Nav) TargetHeading(wind WindModel, lg *log.Logger) (heading float32, turn TurnMethod, rate float32)
func (nav *Nav) TargetSpeed(targetAltitude float32, lg *log.Logger) (float32, float32)
func (nav *Nav) Update(wind WindModel, fp *FlightPlan, lg *log.Logger) *Waypoint

returns passed waypoint if any

type NavAirwork struct {
	Radius   float32
	Center   math.Point2LL
	AltRange [2]float32

	RemainingSteps  int
	NextMoveCounter int
	Heading         float32
	TurnRate        float32
	TurnDirection   TurnMethod
	IAS             float32
	Altitude        float32
	Dive            bool
	ToCenter        bool
}

func StartAirwork added in v0.11.9

func StartAirwork(wp Waypoint, nav Nav) *NavAirwork
func (aw *NavAirwork) Start360(nav Nav)
func (aw *NavAirwork) TargetAltitude() (float32, float32)
func (aw *NavAirwork) TargetHeading() (heading float32, turn TurnMethod, rate float32)
func (aw *NavAirwork) TargetSpeed() (float32, float32, bool)
func (aw *NavAirwork) Update(nav *Nav) bool
type NavAltitude struct {
	Assigned           *float32 // controller assigned
	Cleared            *float32 // from initial clearance
	AfterSpeed         *float32
	AfterSpeedSpeed    *float32
	Expedite           bool
	ExpediteAfterSpeed bool

	// Carried after passing a waypoint if we were unable to meet the
	// restriction at the way point; we keep trying until we get there (or
	// are given another instruction..)
	Restriction *AltitudeRestriction
}
type NavApproach struct {
	Assigned          *Approach
	AssignedId        string
	ATPAVolume        *ATPAVolume
	Cleared           bool
	InterceptState    InterceptState
	PassedApproachFix bool // have we passed a fix on the approach yet?
	PassedFAF         bool
	NoPT              bool
	AtFixClearedRoute []Waypoint
}
type NavFixAssignment struct {
	Arrive struct {
		Altitude *AltitudeRestriction
		Speed    *float32
	}
	Depart struct {
		Fix     *Waypoint
		Heading *float32
	}
}
type NavHeading struct {
	Assigned     *float32
	Turn         *TurnMethod
	Arc          *DMEArc
	JoiningArc   bool
	RacetrackPT  *FlyRacetrackPT
	Standard45PT *FlyStandard45PT
}
type NavSpeed struct {
	Assigned                 *float32
	AfterAltitude            *float32
	AfterAltitudeAltitude    *float32
	MaintainSlowestPractical bool
	MaintainMaximumForward   bool
	// Carried after passing a waypoint
	Restriction *float32
}
type Navaid struct {
	Id       string
	Type     string
	Name     string
	Location math.Point2LL
}

type Overflight added in v0.11.2

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   string                  `json:"initial_controller"`
	Scratchpad          string                  `json:"scratchpad"`
	SecondaryScratchpad string                  `json:"secondary_scratchpad"`
	Description         string                  `json:"description"`
	Airlines            []OverflightAirline     `json:"airlines"`
}

func (*Overflight) PostDeserialize added in v0.11.2

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

type OverflightAirline added in v0.11.2

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 PilotResponse

type PilotResponse struct {
	Message    string
	Unexpected bool // should it be highlighted in the UI
}

type PoolSpecifier added in v0.12.0

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

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 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

type RadioTransmission struct {
	Controller string
	Message    string
	Type       RadioTransmissionType
}

type RadioTransmissionType

type RadioTransmissionType int

func (RadioTransmissionType) String

func (r RadioTransmissionType) String() string

type ReportingPoint

type ReportingPoint struct {
	Fix      string
	Location math.Point2LL
}

type RestrictionArea added in v0.11.9

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 added in v0.11.9

func RestrictionAreaFromTFR(tfr TFR) RestrictionArea

func (*RestrictionArea) AverageVertexPosition added in v0.11.9

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

func (*RestrictionArea) MoveTo added in v0.11.9

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

func (*RestrictionArea) UpdateTriangles added in v0.11.9

func (ra *RestrictionArea) UpdateTriangles()

type RouteGenerator added in v0.11.9

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 added in v0.11.9

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

func (RouteGenerator) Waypoint added in v0.11.9

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 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 SplitConfiguration

type SplitConfiguration map[string]*MultiUserController

callsign -> controller contig

func (SplitConfiguration) GetDepartureController

func (sc SplitConfiguration) GetDepartureController(airport, runway, sid string) (string, error)

func (SplitConfiguration) GetInboundController added in v0.11.2

func (sc SplitConfiguration) GetInboundController(group string) (string, error)

func (SplitConfiguration) ResolveController

func (sc SplitConfiguration) ResolveController(id string, active func(id string) bool) (string, error)

ResolveController takes a controller callsign and returns the signed-in controller that is responsible for that position (possibly just the provided callsign).

type SplitConfigurationSet

type SplitConfigurationSet map[string]SplitConfiguration

split -> config

func (SplitConfigurationSet) GetConfiguration

func (sc SplitConfigurationSet) GetConfiguration(split string) (SplitConfiguration, error)

func (SplitConfigurationSet) GetPrimaryController

func (sc SplitConfigurationSet) GetPrimaryController(split string) (string, error)

func (SplitConfigurationSet) Len

func (sc SplitConfigurationSet) Len() int

func (SplitConfigurationSet) Splits

func (sc SplitConfigurationSet) Splits() []string

type Squawk

type Squawk int

func ParseSquawk

func ParseSquawk(s string) (Squawk, error)

func ParseSquawkOrBlock added in v0.11.10

func ParseSquawkOrBlock(s string) (Squawk, error)

func (Squawk) IsSPC added in v0.11.7

func (squawk 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 (s Squawk) String() string

type StaticDatabase

type StaticDatabase struct {
	Navaids             map[string]Navaid
	Airports            map[string]FAAAirport
	Fixes               map[string]Fix
	Airways             map[string][]Airway
	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
	ERAMAdaptations     map[string]ERAMAdaptation
	TRACONs             map[string]TRACON
	MVAs                map[string][]MVA // TRACON -> MVAs
	BravoAirspace       map[string][]AirspaceVolume
	CharlieAirspace     map[string][]AirspaceVolume
	DeltaAirspace       map[string][]AirspaceVolume
}
var DB *StaticDatabase

func (StaticDatabase) LookupWaypoint

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

type TFR added in v0.11.6

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 added in v0.11.6

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 added in v0.11.6

func MakeTFRCache() TFRCache

func (*TFRCache) Sync added in v0.11.6

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 added in v0.11.6

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 added in v0.11.6

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 TRACON

type TRACON struct {
	Name  string
	ARTCC string
}

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 TurnMethod

type TurnMethod int
const (
	TurnClosest TurnMethod = iota // default
	TurnLeft
	TurnRight
)

func (TurnMethod) String

func (t TurnMethod) String() string

type TypeOfFlight added in v0.12.0

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

type VFRRandomsSpec added in v0.11.9

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

type VFRReportingPoint added in v0.12.0

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

func (*VFRReportingPoint) PostDeserialize added in v0.12.0

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

type VFRRouteSpec added in v0.11.9

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 Waypoint

type Waypoint struct {
	Fix                      string               `json:"fix"`
	Location                 math.Point2LL        // not provided in scenario JSON; derived from fix
	AltitudeRestriction      *AltitudeRestriction `json:"altitude_restriction,omitempty"`
	Speed                    int                  `json:"speed,omitempty"`
	Heading                  int                  `json:"heading,omitempty"` // outbound heading after waypoint
	PresentHeading           bool
	ProcedureTurn            *ProcedureTurn `json:"pt,omitempty"`
	NoPT                     bool           `json:"nopt,omitempty"`
	HumanHandoff             bool           `json:"human_handoff"` // To named TCP.
	TCPHandoff               string         `json:"tcp_handoff"`   // To named TCP.
	PointOut                 string         `json:"pointout,omitempty"`
	ClearApproach            bool           `json:"clear_approach,omitempty"` // used for distractor a/c, clears them for the approach passing the wp.
	FlyOver                  bool           `json:"flyover,omitempty"`
	Delete                   bool           `json:"delete,omitempty"`
	Land                     bool           `json:"land,omitempty"`
	Arc                      *DMEArc        `json:"arc,omitempty"`
	IAF, IF, FAF             bool           // not provided in scenario JSON; derived from fix
	Airway                   string         // when parsing waypoints, this is set if we're on an airway after the fix
	OnSID, OnSTAR            bool           // set during deserialization
	OnApproach               bool           // set during deserialization
	AirworkRadius            int            // set during deserialization
	AirworkMinutes           int            // set during deserialization
	Radius                   float32
	Shift                    float32
	PrimaryScratchpad        string
	ClearPrimaryScratchpad   bool
	SecondaryScratchpad      string
	ClearSecondaryScratchpad bool
	TransferComms            bool
}

func (*Waypoint) ETA

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

func (Waypoint) LogValue

func (wp Waypoint) LogValue() slog.Value

type WaypointArray

type WaypointArray []Waypoint

func RandomizeRoute added in v0.11.9

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

func (WaypointArray) CheckArrival

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

func (WaypointArray) CheckDeparture

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

func (WaypointArray) CheckOverflight added in v0.11.2

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

func (WaypointArray) Encode

func (wslice WaypointArray) Encode() string

func (WaypointArray) InitializeLocations added in v0.11.6

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

func (WaypointArray) RouteString added in v0.11.2

func (w WaypointArray) RouteString() string

func (*WaypointArray) UnmarshalJSON

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

type WaypointCrossingConstraint

type WaypointCrossingConstraint struct {
	Altitude float32
	Fix      string  // where we're trying to readh Altitude
	ETA      float32 // seconds
}

type Wind

type Wind struct {
	Variable  bool
	Direction int `json:"direction"`
	Speed     int `json:"speed"`
	Gust      int `json:"gust"`
}

func (Wind) Randomize added in v0.11.9

func (w Wind) Randomize(r *rand.Rand) Wind

func (Wind) String added in v0.11.9

func (w Wind) String() string

type WindModel

type WindModel interface {
	GetWindVector(p math.Point2LL, alt float32) [2]float32
	AverageWindVector() [2]float32
}

type XNOTAMUpdate added in v0.11.6

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