Move and batch spots the way N1MM does

Two differences from N1MM in the spot path, both found by reading Packet.cs.

Randomising moved every CW spot. PacketSpot.Randomize moves a spot only when it
is not a dupe, not a self spot, not on a CQ frequency, is on CW and is not
working split, and Packet skips it altogether for a station passed to another
band. Moving a dupe or a split station makes it harder to find, not easier, so
this now leaves the same ones alone. Whether a station has been worked comes
from the log, so AppSession asks it before moving a spot.

Split needed knowing where a station is listening, which is in the comment. Qsx
reads it by N1MM's rules: QSX, UP, DOWN, DN, U or D, the word standing alone or
after a space, a bare number after QSX meaning kilohertz inside the band and
anything else an offset from the spot, an offset over a hundred kilohertz
refused unless it says QSX, DN70 read as a grid square rather than five down,
and a listening frequency outside the band thrown away.

Spots reached the bandmap one at a time, each one redrawing every window that
watches it. N1MM queues them and flushes the queue once a second, which is what
this does now: the filters and the randomiser run over the batch, and the
bandmap takes it in one call and raises one change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 10:15:40 +00:00
parent f102e0a304
commit ac63987e0c
9 changed files with 267 additions and 19 deletions

View File

@@ -35,13 +35,18 @@ public static class SpotLine
}
string[] tail = fields[2..];
int stamp = LastTimeStamp(tail);
Frequency where = Frequency.FromKilohertz(kilohertz);
string comment = string.Join(' ', stamp < 0 ? tail : tail[..stamp]).Trim();
return new Spot(
Callsign.Parse(fields[1]),
Frequency.FromKilohertz(kilohertz),
where,
stamp < 0 ? nowUtc : TimeOf(tail[stamp], nowUtc),
SpotSource.Cluster,
spotter,
string.Join(' ', stamp < 0 ? tail : tail[..stamp]).Trim());
comment)
{
Qsx = Qsx.Parse(comment, where),
};
}
/// The node writes the spot's time as `1234Z`. It is usually the last word,