Name the band beside every frequency, and map who was heard
Two additions, both about turning a number into something meaningful. A band column. Next to every frequency -- on the live display, in the line-per-hit output, in saunterbrowse's list and details -- is the name of the band it falls in. 421 MHz is the 70 cm amateur band, and being told so is quicker than remembering where the edges are. The names come from the existing preset table, so there is one band plan to keep right rather than two, but naming is not the job that table was shaped for: several presets cover any frequency, some of them whole-tuner sweeps that say nothing. So the candidates are ranked. Sweeps and the "-complete" duplicates are dropped outright. The narrowest of what is left wins, because it says the most -- 146.52 MHz comes back as the 2 m simplex calling channel rather than as the whole 2 m band. Two exceptions where the narrowest would be the wrong answer: ISM yields to the allocation it shares (433.92 is 70 cm first, 915 is 33 cm first), and shortwave broadcast yields to amateur where the two overlap, because 3.9-4.0 and 7.2-7.3 MHz are Region 1 and 3 broadcast but Region 2 amateur, and this plan is documented as Region 2. 6 MHz really is 49 m shortwave and is left alone. The name is written into each capture's sidecar, so it travels with the recording and an edit to the plan later cannot rewrite history, and saunterbrowse searches on it: /70 cm finds the band without anyone having to remember 420-450 MHz. A map. A licence says where its holder is, so a list of callsigns is also a map. Callsigns heard during a scan are now looked up as the transcripts come in, announced on the display, and written to callsigns.kml in the output directory; saunterbrowse --kml builds the same file from recordings already on disk, and the two continue one map rather than starting two. One placemark per station, not one per transmission: the same repeater heard twenty times in an evening is one operator, and twenty pins on one rooftop would say less than one. Each pin carries the callsign, the licensee, the town, the grid square, and every frequency and time it was heard on. The file is read back on open and added to, so later scans build it up rather than replacing it. Where a licence has no coordinates the grid square's centre is used and the placemark says so -- a square is kilometres across where an address is a street. A callsign with no licence at all is still recorded, in a folder that starts switched off, because that a station was heard is worth keeping even when nothing says where. A file already there that is not readable as KML is never overwritten. Also fixed along the way: - The hit list's "no signals recorded yet" placeholder was one cell short of its row, so it landed in the SNR column and wrapped, making the panel taller than the layout had budgeted for and scrolling the display off a short terminal. The identification column can no longer wrap either, which is what _hit_capacity has always assumed. - Licence lookups now record coordinates. The cache is versioned so that entries written before this are asked about again, rather than pinning every station to its grid square for good. - CallsignBook.wait dropped joined threads; an all-night scan calls it after every transcript and the list only ever grew. - Tests redirect XDG_CACHE_HOME, so a run no longer reads or writes the real lookup cache. 676 -> 761 tests.
This commit is contained in:
parent
739a2faaf4
commit
fb2bb3344b
23 changed files with 2155 additions and 42 deletions
|
|
@ -1,5 +1,5 @@
|
|||
.\" Generated by packaging/make-browse-man.py -- do not edit by hand.
|
||||
.TH SAUNTERBROWSE 1 "2026-08-22" "bandsaunter 2026-08-22_04" "User Commands"
|
||||
.TH SAUNTERBROWSE 1 "2026-08-28" "bandsaunter 2026-08-28_01" "User Commands"
|
||||
.SH NAME
|
||||
saunterbrowse \- read and listen to what a bandsaunter scan collected
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -13,6 +13,8 @@ saunterbrowse \- read and listen to what a bandsaunter scan collected
|
|||
.IR CMD ]
|
||||
.RB [ \-\-list ]
|
||||
.RB [ \-\-callsigns ]
|
||||
.RB [ \-\-kml
|
||||
.RI [ FILE ]]
|
||||
.RB [ \-\-no\-lookup ]
|
||||
.SH DESCRIPTION
|
||||
A scan leaves a directory of recordings. Beside each one is a JSON file
|
||||
|
|
@ -106,6 +108,15 @@ pw-play, paplay, aplay, play, ffplay, mpv.
|
|||
Print every callsign heard in the directory, with the licence it belongs to
|
||||
and where and when it was heard, then exit.
|
||||
.TP
|
||||
.BI \-\-kml " [FILE]"
|
||||
Write a map of where the stations heard in this directory are licensed, and
|
||||
exit. Without a filename it writes
|
||||
.I callsigns.kml
|
||||
in the recordings directory \[em] the same file a scan writes, so a map built
|
||||
this way is continued by the next scan rather than duplicated. See
|
||||
.B THE MAP
|
||||
below.
|
||||
.TP
|
||||
.B \-\-no\-lookup
|
||||
Do not contact the licence database. Callsigns are still found and still
|
||||
described from their prefix; only the name and address are missing.
|
||||
|
|
@ -165,6 +176,37 @@ and time it was heard on, then exits.
|
|||
.PP
|
||||
US amateur licence records are public by law, and include the licensee's
|
||||
address. That is what is shown.
|
||||
.SH THE MAP
|
||||
A licence says where its holder is, so a list of callsigns is also a map. The
|
||||
scanner writes one as it runs and
|
||||
.B \-\-kml
|
||||
builds one from recordings already on disk; both write the same file, so
|
||||
either can carry on from the other.
|
||||
.PP
|
||||
Each station is one placemark, not one per transmission: hearing the same
|
||||
repeater twenty times in an evening is one station, and twenty pins stacked
|
||||
on the same rooftop would say less than one. The pin holds the callsign, the
|
||||
licensee, the town, the grid square, and every frequency and time it was
|
||||
heard on, so clicking it answers "when did I hear this, and where on the
|
||||
dial".
|
||||
.PP
|
||||
The file is added to rather than replaced. A scan on Tuesday continues the
|
||||
map Monday made, which over a few weeks turns into a picture of what your
|
||||
aerial can actually reach.
|
||||
.PP
|
||||
Where the licence carries no coordinates the grid square is used instead, and
|
||||
the placemark says so, because a grid square is kilometres across where a
|
||||
licensed address is a street. A callsign with no licence on file at all is
|
||||
still recorded, in a folder named
|
||||
.IR "no location on file" ,
|
||||
switched off by default: that a station was heard is worth keeping even when
|
||||
nothing says where it was.
|
||||
.PP
|
||||
KML is the format Google Earth uses.
|
||||
.BR qgis (1),
|
||||
.BR marble (1)
|
||||
and OsmAnd open it too, and it is XML, so a scan interrupted halfway through
|
||||
leaves a file that still opens.
|
||||
.SH TRANSCRIPTS
|
||||
A transcript appears only where a recogniser produced one, which means the
|
||||
capture was judged to be speech and
|
||||
|
|
@ -229,6 +271,14 @@ saunterbrowse \-\-callsigns
|
|||
.RE
|
||||
.PP
|
||||
Everyone who identified themselves, and where they were heard.
|
||||
.PP
|
||||
.RS
|
||||
.EX
|
||||
saunterbrowse \-\-kml ~/heard.kml
|
||||
.EE
|
||||
.RE
|
||||
.PP
|
||||
The same thing as a map, to open in Google Earth.
|
||||
.SH EXIT STATUS
|
||||
0 on a clean exit, 1 when the directory holds no recordings, 2 when it does
|
||||
not exist or there is no terminal to draw on.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue