kopia lustrzana https://github.com/cyoung/stratux
Remove hardcoded alert flag on traffic report and replace with simple logic to set it only if a target is within 2nm. This addresses issue #580 .
rodzic
bcd62e7c00
commit
24d20e7cdb
|
@ -111,9 +111,9 @@ type TrafficInfo struct {
|
||||||
Last_speed time.Time // Time of last velocity and track update (stratuxClock).
|
Last_speed time.Time // Time of last velocity and track update (stratuxClock).
|
||||||
Last_source uint8 // Last frequency on which this target was received.
|
Last_source uint8 // Last frequency on which this target was received.
|
||||||
ExtrapolatedPosition bool //TODO: True if Stratux is "coasting" the target from last known position.
|
ExtrapolatedPosition bool //TODO: True if Stratux is "coasting" the target from last known position.
|
||||||
|
BearingDist_valid bool // set when bearing and distance information is valid
|
||||||
Bearing float64 // Bearing in degrees true to traffic from ownship, if it can be calculated.
|
Bearing float64 // Bearing in degrees true to traffic from ownship, if it can be calculated.
|
||||||
Distance float64 // Distance to traffic from ownship, if it can be calculated.
|
Distance float64 // Distance to traffic from ownship, if it can be calculated.
|
||||||
//FIXME: Some indicator that Bearing and Distance are valid, since they aren't always available.
|
|
||||||
//FIXME: Rename variables for consistency, especially "Last_".
|
//FIXME: Rename variables for consistency, especially "Last_".
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,6 +191,7 @@ func sendTrafficUpdates() {
|
||||||
dist, bearing := distance(float64(mySituation.Lat), float64(mySituation.Lng), float64(ti.Lat), float64(ti.Lng))
|
dist, bearing := distance(float64(mySituation.Lat), float64(mySituation.Lng), float64(ti.Lat), float64(ti.Lng))
|
||||||
ti.Distance = dist
|
ti.Distance = dist
|
||||||
ti.Bearing = bearing
|
ti.Bearing = bearing
|
||||||
|
ti.BearingDist_valid = true
|
||||||
}
|
}
|
||||||
ti.Age = stratuxClock.Since(ti.Last_seen).Seconds()
|
ti.Age = stratuxClock.Since(ti.Last_seen).Seconds()
|
||||||
ti.AgeLastAlt = stratuxClock.Since(ti.Last_alt).Seconds()
|
ti.AgeLastAlt = stratuxClock.Since(ti.Last_alt).Seconds()
|
||||||
|
@ -251,12 +252,30 @@ func registerTrafficUpdate(ti TrafficInfo) {
|
||||||
trafficUpdate.SendJSON(ti)
|
trafficUpdate.SendJSON(ti)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isTrafficAlertable(ti TrafficInfo) bool {
|
||||||
|
// Set alert bit if possible and traffic is within some threshold
|
||||||
|
// TODO: Could be more intelligent, taking into account headings etc.
|
||||||
|
if ti.BearingDist_valid &&
|
||||||
|
ti.Distance < 3704 { // TODO: Maybe make configurable?
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func makeTrafficReportMsg(ti TrafficInfo) []byte {
|
func makeTrafficReportMsg(ti TrafficInfo) []byte {
|
||||||
msg := make([]byte, 28)
|
msg := make([]byte, 28)
|
||||||
// See p.16.
|
// See p.16.
|
||||||
msg[0] = 0x14 // Message type "Traffic Report".
|
msg[0] = 0x14 // Message type "Traffic Report".
|
||||||
|
|
||||||
msg[1] = 0x10 | ti.Addr_type // Alert status, address type.
|
// Address type
|
||||||
|
msg[1] = ti.Addr_type
|
||||||
|
|
||||||
|
// Set alert if needed
|
||||||
|
if isTrafficAlertable(ti) {
|
||||||
|
// Set the alert bit. See pg. 18 of GDL90 ICD
|
||||||
|
msg[1] |= 0x10
|
||||||
|
}
|
||||||
|
|
||||||
// ICAO Address.
|
// ICAO Address.
|
||||||
msg[2] = byte((ti.Icao_addr & 0x00FF0000) >> 16)
|
msg[2] = byte((ti.Icao_addr & 0x00FF0000) >> 16)
|
||||||
|
@ -568,6 +587,7 @@ func parseDownlinkReport(s string, signalLevel int) {
|
||||||
ti.Lng = lng
|
ti.Lng = lng
|
||||||
if isGPSValid() {
|
if isGPSValid() {
|
||||||
ti.Distance, ti.Bearing = distance(float64(mySituation.Lat), float64(mySituation.Lng), float64(ti.Lat), float64(ti.Lng))
|
ti.Distance, ti.Bearing = distance(float64(mySituation.Lat), float64(mySituation.Lng), float64(ti.Lat), float64(ti.Lng))
|
||||||
|
ti.BearingDist_valid = true
|
||||||
}
|
}
|
||||||
ti.Last_seen = stratuxClock.Time
|
ti.Last_seen = stratuxClock.Time
|
||||||
ti.ExtrapolatedPosition = false
|
ti.ExtrapolatedPosition = false
|
||||||
|
@ -849,6 +869,7 @@ func esListen() {
|
||||||
ti.Lng = lng
|
ti.Lng = lng
|
||||||
if isGPSValid() {
|
if isGPSValid() {
|
||||||
ti.Distance, ti.Bearing = distance(float64(mySituation.Lat), float64(mySituation.Lng), float64(ti.Lat), float64(ti.Lng))
|
ti.Distance, ti.Bearing = distance(float64(mySituation.Lat), float64(mySituation.Lng), float64(ti.Lat), float64(ti.Lng))
|
||||||
|
ti.BearingDist_valid = true
|
||||||
}
|
}
|
||||||
ti.Position_valid = true
|
ti.Position_valid = true
|
||||||
ti.ExtrapolatedPosition = false
|
ti.ExtrapolatedPosition = false
|
||||||
|
@ -1083,6 +1104,7 @@ func updateDemoTraffic(icao uint32, tail string, relAlt float32, gs float64, off
|
||||||
ti.Lng = float32(lng + traffRelLng)
|
ti.Lng = float32(lng + traffRelLng)
|
||||||
|
|
||||||
ti.Distance, ti.Bearing = distance(float64(lat), float64(lng), float64(ti.Lat), float64(ti.Lng))
|
ti.Distance, ti.Bearing = distance(float64(lat), float64(lng), float64(ti.Lat), float64(ti.Lng))
|
||||||
|
ti.BearingDist_valid = true
|
||||||
|
|
||||||
ti.Position_valid = true
|
ti.Position_valid = true
|
||||||
ti.ExtrapolatedPosition = false
|
ti.ExtrapolatedPosition = false
|
||||||
|
|
Ładowanie…
Reference in New Issue