fix(ui): the opening badge must say what is open, not that something is
It read "6M OPEN" and kept the rest in a tooltip nobody hovers — an alarm with no content, announcing that something was happening and refusing to say what. Band, direction and typical distance are on the badge now: the three facts that decide whether to point an antenna, all readable without touching anything. Out of season gets a mark there too, since that is the one an operator must not learn last. The compass point is computed in Go and carried on the Opening rather than derived in the UI. Sector() already gets the wrap round north right, and it got it wrong once — a second copy of that arithmetic is how a badge ends up naming the opposite direction to the log line beside it.
This commit is contained in:
@@ -83,14 +83,19 @@ func Watched(band string) bool { return watched[strings.ToLower(strings.TrimSpac
|
||||
|
||||
// Opening is a detected opening, ready to be announced.
|
||||
type Opening struct {
|
||||
Band string `json:"band"`
|
||||
Calls int `json:"calls"` // distinct DX stations seen
|
||||
MedianKm int `json:"median_km"` // typical hop length
|
||||
BearingMin int `json:"bearing_min"` // sector, degrees
|
||||
BearingMax int `json:"bearing_max"`
|
||||
InSeason bool `json:"in_season"` // false = unusual for the time of year
|
||||
At time.Time `json:"at"`
|
||||
Examples []string `json:"examples"` // a few callsigns, for the announcement
|
||||
Band string `json:"band"`
|
||||
Calls int `json:"calls"` // distinct DX stations seen
|
||||
MedianKm int `json:"median_km"` // typical hop length
|
||||
BearingMin int `json:"bearing_min"` // sector, degrees
|
||||
BearingMax int `json:"bearing_max"`
|
||||
// Compass is the sector as a point of the compass ("NE"), computed here so
|
||||
// the UI never has to redo the wrap-round-north arithmetic that Sector()
|
||||
// already gets right — two answers to that question is how a badge ends up
|
||||
// naming the opposite direction.
|
||||
Compass string `json:"compass"`
|
||||
InSeason bool `json:"in_season"` // false = unusual for the time of year
|
||||
At time.Time `json:"at"`
|
||||
Examples []string `json:"examples"` // a few callsigns, for the announcement
|
||||
}
|
||||
|
||||
// Detector keeps the rolling window and the per-band quiet period.
|
||||
@@ -204,10 +209,12 @@ func evaluate(band string, spots []Spot, cfg Config) *Opening {
|
||||
if len(calls) > 5 {
|
||||
calls = calls[:5]
|
||||
}
|
||||
return &Opening{
|
||||
op := &Opening{
|
||||
Band: band, Calls: len(seen), MedianKm: dists[len(dists)/2],
|
||||
BearingMin: lo, BearingMax: hi, Examples: calls,
|
||||
}
|
||||
op.Compass = compass(midBearing(lo, hi))
|
||||
return op
|
||||
}
|
||||
|
||||
// arc returns the smallest compass sector containing every bearing, coping with
|
||||
|
||||
Reference in New Issue
Block a user