Add the name, comment and lights from N1MM's entry window

Three more things off the screenshot of N1MM's entry window.

A Name box and a Comment box beside the exchange. Neither is part of the
exchange, so an empty one does not hold up a contact and ESM does not wait for
it; both fill the log columns of those names, and a contest that exchanges a
name keeps what was exchanged. Tab now walks the callsign, the exchange, the
name and the comment before coming round again, which is what the boxes being
there implies. The name is filled from the call history file, and what that file
says in its UserText column is written under the entry boxes, where N1MM writes
it.

Two lights beside the run switch: green while a radio is answering, red while
something is going out on the air. The transmit light follows the keyer, so with
cwdaemon it goes out when the message has actually finished rather than when the
text was handed over.

The window is wider to fit the two new boxes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 09:13:58 +00:00
co-authored by Claude Opus 5
parent f8e07471a6
commit 7c2a2ed768
6 changed files with 215 additions and 13 deletions
+21 -1
View File
@@ -37,6 +37,13 @@ public sealed class RadioPosition
/// searching. Each radio runs or searches on its own.
public bool IsRunning { get; set; }
/// The other operator's name and a note about the contact. Neither is part
/// of any exchange — N1MM keeps both beside the exchange boxes and writes
/// them into the log — so neither counts towards a complete exchange.
public string OtherName { get; set; } = "";
public string Comment { get; set; } = "";
public Contest Contest => Session.Contest;
public ContestInstance Instance => Session.Instance;
@@ -83,8 +90,10 @@ public sealed class RadioPosition
{
throw new InvalidOperationException($"the exchange for {Entry.Call} is not complete");
}
Qso stored = Session.Add(BuildQso(Entry.Call.Trim()));
Qso stored = Session.Add(Noted(BuildQso(Entry.Call.Trim())));
Entry.Clear();
OtherName = "";
Comment = "";
return stored;
}
@@ -119,9 +128,20 @@ public sealed class RadioPosition
public void Wipe()
{
Entry.Clear();
OtherName = "";
Comment = "";
Session.NotifyChanged();
}
/// The name and comment boxes fill the log columns of the same names. A
/// contest that exchanges a name has already filled that column, and what
/// was exchanged wins.
private Qso Noted(Qso qso) => qso with
{
Name = qso.Name.Length > 0 ? qso.Name : OtherName.Trim(),
Comment = qso.Comment.Length > 0 ? qso.Comment : Comment.Trim(),
};
/// The report an operator sends without thinking about it: 599 on CW and
/// digital modes, 59 on phone.
public string DefaultReport() => Mode.Category switch