Take the rest of what N1MM's QTC window does on CW

Reading the source again after this was tried turned up several things it had
wrong or left out.

The TU message went out only when reading a series out. N1MM sends it whichever
way the traffic went, and lets it name the series: {QTC} in it stands for the
header, so TU {QTC} 73 goes out as TU QTC 3/10 73.

The RX Ready button was hidden while sending and sent nothing on CW. It is
N1MM's QRV button: reading out it says R U QRV and keys QRV?, taking down it
says QRV and keys QRV.

The fields were asked for again with shift and Enter, which was made up. N1MM
uses the number keys, and writes them under the lines: 1, 2, 3 and 4 send the
time, call, serial or header of the last line again while reading out, and
shift with 1, 2 or 3 asks for that field while taking down.

The buttons now carry N1MM's names for the direction the traffic is going —
R U QRV, Snd Hdr, Snd1 to Snd10, Exit reading out; QRV, Hdr Agn, Agn1 to Agn10,
Exit taking down — and the Cfm column and Clear are hidden while reading out,
as N1MM hides them. The separate Send Hdr button is gone: N1MM has one button
there that sends the header one way and asks for it the other.

The log window gained N1MM's QTC? column for a contest that carries QTC
traffic. It holds the series, so a QTC row can be told from a contact; before
this a QTC row read as an ordinary one with odd values in the report columns.

Driven under Xvfb against a fake cwdaemon. Reading out: QRV?, QTC 3/2,
2319 DL7GGG 03, then 2319 and QTC 3/2 from the number keys, and
TU QTC 3/2 73 on Exit. Taking down: QRV, AGN TIME, AGN CALL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoGtneMQaz4M9w7Kk49AVD
This commit is contained in:
2026-08-30 23:23:22 +00:00
co-authored by Claude Opus 5
parent dc1c593b4d
commit 9424c488ea
9 changed files with 181 additions and 56 deletions
+6
View File
@@ -243,6 +243,12 @@ public sealed class QsoEditor
kinds[mapped] = field.Kind;
columns.Add(new QsoColumn(field.Label, mapped, Math.Max(field.Width, field.Label.Length + 1)));
}
if (contest.HasQtcTraffic)
{
// N1MM's header for the misc column in WAE, where it holds the
// series a QTC row belongs to
columns.Add(new QsoColumn("QTC?", QsoField.MiscText, 6));
}
columns.Add(new QsoColumn("Op", QsoField.Operator, 8));
return columns;
}
+12
View File
@@ -22,6 +22,12 @@ public static class QtcMessages
/// rather than into its settings, two spaces and all.
public const string HeaderAgain = "HDR AGN";
/// What the station taking traffic down sends to say it is ready.
public const string ReadyToReceive = "QRV";
/// What the station reading traffic out asks before it starts.
public const string AreYouReady = "QRV?";
public static string Spacing(string setting) =>
setting.Replace("S", " ", StringComparison.Ordinal);
@@ -33,4 +39,10 @@ public static class QtcMessages
string gap = Spacing(spacing);
return $"{time.Trim()}{gap}{call.Trim()}{gap}{number.Trim()}";
}
/// The message that ends the exchange, sent whichever way the traffic went.
/// `{QTC}` in it stands for the header of the series, so `TU {QTC} 73`
/// goes out as `TU QTC 3/10 73`.
public static string Tu(string template, string header) =>
template.Replace("{QTC}", header.Trim().ToUpperInvariant(), StringComparison.OrdinalIgnoreCase);
}