aviation

package
v0.11.6 Latest Latest
Warning

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

Go to latest
Published: Oct 22, 2024 License: GPL-3.0 Imports: 30 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 (
	ILSApproach = iota
	RNAVApproach
	ChartedVisualApproach
)
View Source
const (
	UNKNOWN = iota
	IFR
	VFR
	DVFR
	SVFR
)
View Source
const (
	Standby = iota
	Charlie
)
View Source
const (
	AirspaceVolumePolygon = iota
	AirspaceVolumeCircle
)
View Source
const (
	RouteBasedFix = "route"
	ZoneBasedFix  = "zone"
)
View Source
const (
	NotIntercepting = iota
	InitialHeading
	TurningToJoin
	HoldingLocalizer
)
View Source
const (
	TurnClosest = iota // default
	TurnLeft
	TurnRight
)
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 MaximumRate = 100000
View Source
const StandardTurnRate = 3

Variables

View Source
var (
	ErrClearedForUnexpectedApproach = errors.New("Cleared for unexpected approach")
	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")
	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")
	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")
	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 CheckVideoMapManifest added in v0.11.6

func CheckVideoMapManifest(filename string, e *util.ErrorLogger)

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 ParseARINC424

func ParseARINC424(file []byte) (map[string]FAAAirport, map[string]Navaid, map[string]Fix, map[string][]Airway)

func PlausibleFinalAltitude

func PlausibleFinalAltitude(fp *FlightPlan, perf AircraftPerformance, nmPerLongitude float32,
	magneticVariation float32) (altitude int)

func PrintCIFPRoutes

func PrintCIFPRoutes(airport string) error

func PrintVideoMaps

func PrintVideoMaps(path string, e *util.ErrorLogger)

func SquawkIsSPC

func SquawkIsSPC(squawk Squawk) (bool, string)

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

func StringIsSPC

func StringIsSPC(code string) bool

func TASToIAS

func TASToIAS(tas, altitude float32) float32

func TurnAngle

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

Types

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 // Unique identifier, set after deserialization
	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

func (AdaptationFixes) Fix

func (fixes AdaptationFixes) Fix(altitude string) (AdaptationFix, error)

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.
	Callsign string

	Scratchpad          string
	SecondaryScratchpad string
	Squawk              Squawk // actually squawking
	Mode                TransponderMode
	TempAltitude        int
	FlightPlan          *FlightPlan
	PointOutHistory     []string

	// STARS-related state that is globally visible
	TrackingController        string // Who has the radar track
	ControllingController     string // Who has control; not necessarily the same as TrackingController
	HandoffTrackController    string // Handoff offered but not yet accepted
	GlobalLeaderLineDirection *math.CardinalOrdinalDirection
	RedirectedHandoff         RedirectedHandoff
	SPCOverride               string

	HoldForRelease   bool
	Released         bool // only used for hold for release
	WaitingForLaunch bool // for departures

	// The controller who gave approach clearance
	ApproachController string

	Strip FlightStrip

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

	// Departure related state
	DepartureContactAltitude   float32
	DepartureContactController string

	// Arrival-related state
	GoAroundDistance    *float32
	STAR                string
	STARRunwayWaypoints map[string]WaypointArray
	GotContactTower     bool

	// Who to try to hand off to at a waypoint with /ho
	WaypointHandoffController string
}

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

func (*Aircraft) ClearedStraightInApproach

func (ac *Aircraft) ClearedStraightInApproach(id string) []RadioTransmission

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(controllers map[string]*Controller, 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) GoAround

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

func (*Aircraft) HandleControllerDisconnect

func (ac *Aircraft) HandleControllerDisconnect(callsign string, primaryController string)

func (*Aircraft) Heading

func (ac *Aircraft) Heading() float32

func (*Aircraft) IAS

func (ac *Aircraft) IAS() float32

func (*Aircraft) InitializeArrival

func (ac *Aircraft) InitializeArrival(ap *Airport, arr *Arrival, arrivalHandoffController string, goAround bool,
	nmPerLongitude float32, magneticVariation float32, 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, scratchpads map[string]string,
	primaryController string, multiControllers SplitConfiguration,
	lg *log.Logger) error

func (*Aircraft) InitializeOverflight added in v0.11.2

func (ac *Aircraft) InitializeOverflight(of *Overflight, controller string, nmPerLongitude float32,
	magneticVariation float32, lg *log.Logger) error

func (*Aircraft) InterceptLocalizer

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

func (*Aircraft) IsAirborne

func (ac *Aircraft) IsAirborne() bool

func (*Aircraft) IsAssociated

func (ac *Aircraft) IsAssociated() 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) NewFlightPlan

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

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

func (ac *Aircraft) ToggleSPCOverride(spc string)

func (*Aircraft) TransferTracks

func (ac *Aircraft) TransferTracks(from, to string)

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, simlg *log.Logger) *Waypoint

func (*Aircraft) Waypoints

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

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)

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

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

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, e *util.ErrorLogger)

type AirspaceVolume

type AirspaceVolume struct {
	Name    string             `json:"name"`
	Type    AirspaceVolumeType `json:"type"`
	Floor   int                `json:"floor"`
	Ceiling int                `json:"ceiling"`
	// Polygon
	Vertices []math.Point2LL `json:"vertices"`
	// 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

type AirspaceVolumeType

type AirspaceVolumeType int

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) ([2]float32, 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"`
	TowerController string          `json:"tower_controller"`
}

func (*Approach) Heading

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

func (*Approach) Line

func (ap *Approach) Line() [2]math.Point2LL

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(callsign string, track RadarTrack, heading float32, scratchpad string,
	forceGhost bool, offset float32, leaderDirection math.CardinalOrdinalDirection, runwayIntersection [2]float32,
	nmPerLongitude float32, magneticVariation float32, other *ApproachRegion) *GhostAircraft

type ApproachType

type ApproachType int

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, e *util.ErrorLogger)

type ArrivalAirline

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

type Controller

type Controller struct {
	Callsign           string    // Not provided in scenario JSON
	FullName           string    `json:"full_name"`
	Frequency          Frequency `json:"frequency"`
	SectorId           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.
	IsHuman            bool      // Not provided in scenario JSON
	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
	SignOnTime         time.Time
}

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
}

type DepartureAirline

type DepartureAirline struct {
	AirlineSpecifier
}

type ERAMAdaptation

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

func (ERAMAdaptation) AdaptationFixForAltitude

func (ea ERAMAdaptation) AdaptationFixForAltitude(fix string, altitude string) *AdaptationFix

func (ERAMAdaptation) FixForRouteAndAltitude

func (ea ERAMAdaptation) FixForRouteAndAltitude(route string, altitude string) *AdaptationFix

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
	Elevation  int
	Location   math.Point2LL
	Runways    []Runway
	Approaches map[string][]WaypointArray
	STARs      map[string]STAR
	ARTCC      string
}

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 {
	Callsign       string
	Rules          FlightRules
	AircraftType   string
	CruiseSpeed    int
	AssignedSquawk Squawk // from ATC
	// An ECID (CID) are three alpha-numeric characters (eg. 971, 43A,
	// etc.) and is what ERAM assigns to a track to act as another way to
	// identify that track. To execute commands, controllers may use the
	// ECID instead of the aircrafts callsign.
	ECID                   string
	DepartureAirport       string
	DepartTimeEst          int
	DepartTimeActual       int
	Altitude               int
	ArrivalAirport         string
	Hours, Minutes         int
	FuelHours, FuelMinutes int
	AlternateAirport       string
	Exit                   string
	Route                  string
	Remarks                string
}

func (FlightPlan) BaseType

func (fp FlightPlan) BaseType() string

func (FlightPlan) TypeWithoutSuffix

func (fp FlightPlan) TypeWithoutSuffix() string

type FlightRules

type FlightRules int

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
	Annotations [9]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 GhostAircraft

type GhostAircraft struct {
	Callsign            string
	Position            math.Point2LL
	Groundspeed         int
	LeaderLineDirection math.CardinalOrdinalDirection
	TrackId             string
}

type InterceptLocalizerState

type InterceptLocalizerState int

type Locator

type Locator interface {
	Locate(fix string) (math.Point2LL, bool)
}

type METAR

type METAR struct {
	AirportICAO string
	Time        string
	Auto        bool
	Wind        string
	Weather     string
	Altimeter   string
	Rmk         string
}

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
	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     []Waypoint
}

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

func MakeArrivalNav

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

func MakeDepartureNav

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

func MakeOverflightNav added in v0.11.2

func MakeOverflightNav(of *Overflight, fp FlightPlan, perf AircraftPerformance,
	nmPerLongitude float32, magneticVariation float32, lg *log.Logger) *Nav
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) InterceptLocalizer(airport string) PilotResponse
func (nav *Nav) IsAirborne() bool
func (nav *Nav) LocalizerHeading(wind WindModel, lg *log.Logger) (heading float32, turn TurnMethod, rate float32)
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) 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(lg *log.Logger) (float32, float32)
func (nav *Nav) Update(wind WindModel, lg *log.Logger) *Waypoint

returns passed waypoint if any

type NavAltitude struct {
	Assigned        *float32 // controller assigned
	Cleared         *float32 // from initial clearance
	AfterSpeed      *float32
	AfterSpeedSpeed *float32
	Expedite        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    InterceptLocalizerState
	PassedApproachFix bool // have we passed a fix on the approach yet?
	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, 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 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 {
	Position    math.Point2LL
	Altitude    int
	Groundspeed int
	Time        time.Time
}

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 RedirectedHandoff

type RedirectedHandoff struct {
	OriginalOwner string   // Controller callsign
	Redirector    []string // Controller callsign
	RedirectedTo  string   // Controller callsign
}

func (*RedirectedHandoff) AddRedirector

func (rd *RedirectedHandoff) AddRedirector(ctrl *Controller)

func (*RedirectedHandoff) GetLastRedirector

func (rd *RedirectedHandoff) GetLastRedirector() string

func (*RedirectedHandoff) ShouldFallbackToHandoff

func (rd *RedirectedHandoff) ShouldFallbackToHandoff(ctrl, octrl string) bool

func (*RedirectedHandoff) ShowRDIndicator

func (rd *RedirectedHandoff) ShowRDIndicator(callsign string, RDIndicatorEnd time.Time) bool

type ReportingPoint

type ReportingPoint struct {
	Fix      string
	Location math.Point2LL
}

type Runway

type Runway struct {
	Id        string
	Heading   float32
	Threshold math.Point2LL
	Elevation int
}

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
}

Special purpose code: beacon codes are squawked in various unusual situations.

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(callsign string, active func(callsign 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 (Squawk) String

func (s Squawk) String() string

type SquawkCodePool added in v0.11.2

type SquawkCodePool struct {
	First, Last Squawk // inclusive range of codes
	// Available squawk codes are represented by a bitset
	AssignedBits []uint64
}

func MakeCompleteSquawkCodePool added in v0.11.2

func MakeCompleteSquawkCodePool() *SquawkCodePool

func MakeSquawkBankCodePool added in v0.11.2

func MakeSquawkBankCodePool(bank int) *SquawkCodePool

func (*SquawkCodePool) Claim added in v0.11.2

func (p *SquawkCodePool) Claim(code Squawk) error

func (*SquawkCodePool) Get added in v0.11.2

func (p *SquawkCodePool) Get() (Squawk, error)

func (*SquawkCodePool) IsAssigned added in v0.11.2

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

func (*SquawkCodePool) NumAvailable added in v0.11.2

func (p *SquawkCodePool) NumAvailable() int

func (*SquawkCodePool) Return added in v0.11.2

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

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

func (TransponderMode) String

func (t TransponderMode) String() string

type TurnMethod

type TurnMethod int

func (TurnMethod) String

func (t TurnMethod) String() string

type VideoMap

type VideoMap struct {
	Label       string // for DCB
	Group       int    // 0 -> A, 1 -> B
	Name        string // For maps system list
	Id          int
	Category    int
	Restriction struct {
		Id        int
		Text      [2]string
		TextBlink bool
		HideText  bool
	}
	Color int
	Lines [][]math.Point2LL

	CommandBuffer renderer.CommandBuffer
}

Note: this should match ViceMapSpec/VideoMap in crc2vice/dat2vice. (crc2vice doesn't support all of these, though.)

type VideoMapLibrary

type VideoMapLibrary struct {
	Maps []VideoMap
}

This should match VideoMapLibrary in dat2vice

func HashCheckLoadVideoMap added in v0.11.6

func HashCheckLoadVideoMap(path string, wantHash []byte) (*VideoMapLibrary, error)

Loads the specified video map file, though only if its hash matches the provided hash. Returns an error otherwise.

func LoadVideoMapLibrary added in v0.11.6

func LoadVideoMapLibrary(path string) (*VideoMapLibrary, error)

type VideoMapManifest added in v0.11.6

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

VideoMapManifest stores which maps are available in a video map file and is also able to provide the video map file's hash.

func LoadVideoMapManifest added in v0.11.6

func LoadVideoMapManifest(filename string) (*VideoMapManifest, error)

func (VideoMapManifest) HasMap added in v0.11.6

func (v VideoMapManifest) HasMap(s string) bool

func (VideoMapManifest) Hash added in v0.11.6

func (v VideoMapManifest) Hash() ([]byte, error)

Hash returns a hash of the underlying video map file (i.e., not the manifest!)

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
	ProcedureTurn       *ProcedureTurn       `json:"pt,omitempty"`
	NoPT                bool                 `json:"nopt,omitempty"`
	Handoff             bool                 `json:"handoff,omitempty"`
	PointOut            string               `json:"pointout,omitempty"`
	FlyOver             bool                 `json:"flyover,omitempty"`
	Delete              bool                 `json:"delete,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
}

func (*Waypoint) ETA

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

func (Waypoint) LogValue

func (wp Waypoint) LogValue() slog.Value

type WaypointArray

type WaypointArray []Waypoint

func (WaypointArray) CheckApproach

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

func (WaypointArray) CheckArrival

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

func (WaypointArray) CheckDeparture

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

func (WaypointArray) CheckOverflight added in v0.11.2

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

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, e *util.ErrorLogger)

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 {
	Direction int32 `json:"direction"`
	Speed     int32 `json:"speed"`
	Gust      int32 `json:"gust"`
}

type WindModel

type WindModel interface {
	GetWindVector(p math.Point2LL, alt float32) math.Point2LL
	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