From 9f635550bd8e73bc86e5ae6f6c32220ea38986d8 Mon Sep 17 00:00:00 2001 From: ericek111 Date: Thu, 3 Sep 2026 15:02:08 +0000 Subject: [PATCH] Read a QTC series out on RTTY MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit N1MM's Send All: the whole series as one message — the heading, every line with the operator's spacing between them, then the ending, with `{TX}` and `{RX}` around it so it keys the transmitter and drops it again. The shape is N1MM's, from `QTCWindow.cs:3609`. A line is the three fields joined with hyphens, which is how N1MM writes them, and Snd n sends one line again for a station that missed it. One message rather than a button per line because a series is close to a minute of transmission at 45 baud: the type-ahead buffer holds it and paces the engine. Three settings with N1MM's names and defaults — `WAESendAllHeadingText`, `WAESendAllEndingText` and `WAESQTCSpacing` — on the QTC window's setup dialog. `{ENTERLF}` is new to the expander and stands for a carriage return and a line feed; `{QTC}` is filled in by the window, which is the only place that knows which series is going out. The messages are tested as text. Nothing has gone on the air. Left out: N1MM's four SSB recordings, which need a voice keyer, and its RTTY messages for the station taking traffic down, which are typed into the digital window's transmit pane here. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PdAYHcdRktqKry7nk414TU --- docs/unfinished.md | 38 ++++++--- src/Nonemm.App/Configuration/Settings.cs | 10 +++ src/Nonemm.App/Dialogs/QtcSetupDialog.axaml | 13 ++- .../Dialogs/QtcSetupDialog.axaml.cs | 6 ++ src/Nonemm.App/Windows/QtcWindow.axaml | 1 + src/Nonemm.App/Windows/QtcWindow.axaml.cs | 85 +++++++++++++++---- src/Nonemm.Session/MessageExpander.cs | 3 + src/Nonemm.Session/QtcMessages.cs | 73 ++++++++++++++-- .../MessageExpanderTests.cs | 8 ++ .../Nonemm.Session.Tests/QtcMessagesTests.cs | 51 +++++++++++ 10 files changed, 255 insertions(+), 33 deletions(-) diff --git a/docs/unfinished.md b/docs/unfinished.md index 0110d3e..8b6392a 100644 --- a/docs/unfinished.md +++ b/docs/unfinished.md @@ -355,13 +355,29 @@ of an SO2R station cannot call CQ by voice. Alternating CQ therefore works on CW only, though nothing in it is CW-specific: a voice keyer that reports when the recording has finished would drive it as it stands. -**The QTC window transmits on CW only.** The header, the lines, the QRV, the TU -and the again messages go out through the keyer, with N1MM's messages and -N1MM's defaults. Nothing goes out on SSB or RTTY: N1MM plays four recordings on -SSB — QRV, Agn, Cfm and TU — and sends RTTY from its digital window, and this -program has neither a voice keyer nor a digital window. N1MM's Send All, which -keys a whole series at once, belongs to that RTTY window and is not here -either. +**The QTC window sends on CW and RTTY, not on SSB.** On CW the header, the +lines, the QRV, the TU and the again messages go out through the keyer, with +N1MM's messages and N1MM's defaults. + +On RTTY the station reading traffic out has Send All, which is N1MM's: the whole +series as one message, the heading, then every line with the operator's spacing +between them, then the ending, and `{TX}` and `{RX}` around the lot so it keys +the transmitter and drops it again. A line is the three fields joined with +hyphens, which is how N1MM writes them and it offers no setting for it. Snd n +sends one line again for a station that missed it. The heading, the ending and +the spacing are settings, N1MM's `WAESendAllHeadingText`, +`WAESendAllEndingText` and `WAESQTCSpacing`, with its defaults; `{ENTERLF}` in +them is new to the expander and stands for a carriage return and a line feed. + +A whole series is the best part of a minute of transmission at 45 baud, which is +why it is one message rather than a button per line: the type-ahead buffer holds +it and paces the engine, and the operator presses one button. This has been +tested as text — what the message comes out as — and not on the air. + +What is not here: N1MM's four SSB recordings — QRV, Agn, Cfm and TU — which need +a voice keyer, and its RTTY messages for the station taking traffic down, which +are `WAERXReadyText`, `WAEAllAgnText`, `WAEAGNText` and `WAESaveQTCText`. Those +four are typed into the digital window's transmit pane here. **Cut numbers are not sent.** N1MM can key a serial number as letters — `N` for 9, `T` for 0 — and offers several styles. Nothing here does, in a QTC line or in @@ -411,9 +427,11 @@ ones the station's log needs — and both of N1MM's names open a log with it. A sprint log would be scored by the wrong rules, and a log started here writes `BARTGRTTYS` into the contest name, which N1MM would read as the sprint. -**Digital modes.** A contact can be logged as RTTY or another digital mode, and -the contest rules score it, but there is no digital window: no decoding, no -transmitting, no interface to fldigi, MMTTY or similar. +**Digital interfaces other than MMTTY.** A contact can be logged as RTTY or +another digital mode and the contest rules score it, and the digital window +decodes and transmits through MMTTY over the Wine bridge. What is not here: +fldigi, MMVARI, 2Tone and the hardware TNCs, all of which N1MM drives. +`DigitalEngine` is the place to add them. **Contest coverage.** Twenty-five families are built in, plus whatever `.udc` files are in the user-defined folder. N1MM ships well over a hundred. Opening a log diff --git a/src/Nonemm.App/Configuration/Settings.cs b/src/Nonemm.App/Configuration/Settings.cs index 060eae0..681501b 100644 --- a/src/Nonemm.App/Configuration/Settings.cs +++ b/src/Nonemm.App/Configuration/Settings.cs @@ -169,6 +169,16 @@ public sealed record Settings public string QtcCwTu { get; init; } = ""; + /// The RTTY messages the QTC window sends, with N1MM's defaults. The + /// spacing goes between the lines of a series rather than between the + /// fields of one, and all three are macro templates: `{ENTER}` for a + /// carriage return, `{QTC}` for the header of the series. + public string QtcRttySpacing { get; init; } = QtcMessages.DefaultRttySpacing; + + public string QtcRttySendAllHeading { get; init; } = QtcMessages.DefaultSendAllHeading; + + public string QtcRttySendAllEnding { get; init; } = QtcMessages.DefaultSendAllEnding; + /// Sub-band boundaries the operator has changed. Empty means the defaults /// in `BandPlan.Default`; an entry replaces one band's boundaries. public IReadOnlyList SubBands { get; init; } = []; diff --git a/src/Nonemm.App/Dialogs/QtcSetupDialog.axaml b/src/Nonemm.App/Dialogs/QtcSetupDialog.axaml index 9ef7258..f83abf7 100644 --- a/src/Nonemm.App/Dialogs/QtcSetupDialog.axaml +++ b/src/Nonemm.App/Dialogs/QtcSetupDialog.axaml @@ -33,8 +33,19 @@ + + + + + + + + + + + Text="N1MM's SSB recordings are left out: playing those needs a voice keyer, and this program has none. So are its RTTY messages for the station taking traffic down — RX Ready, All Agn, Agn and Save — which are typed into the digital window's transmit pane here." />