1 Commits

Author SHA1 Message Date
rmcguire 25486b5c8f add speed filters
Publish / release (push) Successful in 31s
2026-06-23 22:47:17 -04:00
2 changed files with 45 additions and 0 deletions
+32
View File
@@ -104,6 +104,38 @@ func OnGround() AircraftFilter {
return func(a *Aircraft) bool { return a.AltBaro.OnGround }
}
// SpeedSource selects which speed reading a speed filter compares against. Its
// zero value is GroundSpeed.
type SpeedSource int
const (
// GroundSpeed measures against GS (ground speed, knots).
GroundSpeed SpeedSource = iota
// TrueAirspeed measures against TAS (true airspeed, knots).
TrueAirspeed
)
func (s SpeedSource) of(a *Aircraft) float64 {
if s == TrueAirspeed {
return float64(a.TAS)
}
return a.GS
}
// MinSpeed keeps aircraft at or above knots, measured by src.
func MinSpeed(knots float64, src SpeedSource) AircraftFilter {
return func(a *Aircraft) bool { return src.of(a) >= knots }
}
// MaxSpeed keeps aircraft with a positive reading at or below knots, measured by
// src; aircraft with no reading are dropped.
func MaxSpeed(knots float64, src SpeedSource) AircraftFilter {
return func(a *Aircraft) bool {
v := src.of(a)
return v > 0 && v <= knots
}
}
// WithinNM keeps aircraft within the given range (nautical miles) of the receiver.
func WithinNM(nm float64) AircraftFilter {
return func(a *Aircraft) bool { return a.RDst > 0 && a.RDst <= nm }
+13
View File
@@ -68,6 +68,19 @@ func TestAircraftFilters(t *testing.T) {
t.Errorf("WithinNM kept %s at %.1f nm", a.Hex, a.RDst)
}
}
fast := r.Filter(MinSpeed(250, GroundSpeed))
for _, a := range fast {
if a.GS < 250 {
t.Errorf("MinSpeed kept %s at %.0f kt", a.Hex, a.GS)
}
}
// MaxSpeed drops aircraft with no reading, so every kept aircraft is positive.
slow := r.Filter(MaxSpeed(250, GroundSpeed))
for _, a := range slow {
if a.GS <= 0 || a.GS > 250 {
t.Errorf("MaxSpeed kept %s at %.0f kt", a.Hex, a.GS)
}
}
// Composition is AND: position AND high altitude is a subset of each.
both := r.Filter(WithPosition(), MinAltitude(30000))
if len(both) > len(pos) || len(both) > len(high) {