Stack the calls that answer a CQ, the way N1MM does

A CQ is answered by more than one station. N1MM lets the operator put the
others on a stack and work them one after another; this is that, with N1MM's
keys and macros.

Ctrl+Alt+G and {STACKANOTHER} put the call being typed on the stack and clear
the boxes. Alt+G brings the top call back. Alt+D drops it. {SOCALLSTACK} both
stacks and unstacks in one key: it swaps the typed call for the top one, stacks
it when the stack is empty, and takes the top call when the boxes are.
{LOGTHENPOP} and {LOGTHENNEXT} log the contact and bring the next caller in.
{CLRSTACK} empties it.

The rules are N1MM's, and CallStack and the entry actions hold them without a
window, so they are unit-tested: stacking only while running, nothing shorter
than two characters, no dupe, no frequency typed into the callsign box, a call
already on the stack moved rather than repeated, and a multiplier to the front.
{SOCALLSTACK} takes the stacked call off before it puts the typed one on, so a
multiplier just typed cannot come straight back.

Two places differ. N1MM refuses your own call only while the stack is empty;
it is never a station to work, so it is refused either way here. And the order
is multipliers first in every mode: N1MM's digital window offers first-in and
last-in as well, and there is no digital window here.

The stack window opens by itself with the first call and closes with the last,
or Window > Call Stack opens it. It does not take the keyboard when it opens,
because the operator is typing the next call. The next call out is ringed and
each is coloured by what working it would bring, as in every other window.

OperatingPosition.JudgeCall now answers what a call alone is worth, which the
stack window and the check window both need; it was private to the check
window before.

Driven under Xvfb: four calls stacked with Ctrl+Alt+G and listed in the window,
Alt+G bringing the top one into the boxes, Alt+D dropping the next.

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 22:23:30 +00:00
parent bb35848e11
commit ec8cdb88d7
16 changed files with 757 additions and 26 deletions

View File

@@ -132,7 +132,8 @@ macros that are filled in:
The action macros run rather than standing for text: `{WIPE}`, `{LOG}`,
`{RUN}`, `{S&P}`, `{SPACE}`, `{SPOTME}`, `{STOPTX}`, `{FREQUP}`, `{FREQDN}`,
`{PGUP}`, `{PGDN}`, `{JUMPRX}`, `{JUMPRXTX}`, `{CTRLF1}` to `{CTRLF12}` to send
`{PGUP}`, `{PGDN}`, `{JUMPRX}`, `{JUMPRXTX}`, `{STACKANOTHER}`, `{SOCALLSTACK}`,
`{LOGTHENPOP}`, `{LOGTHENNEXT}`, `{CLRSTACK}`, `{CTRLF1}` to `{CTRLF12}` to send
on the other radio, `{TELNET sh/dx}` to put a command on the cluster, and
`{OTRSP TX2}` to send one to the SO2R box. An action runs before the message
goes out, unless it stands after `{END}`, and then it runs once the message has
@@ -145,8 +146,8 @@ How far `{FREQUP}` and the rest move the radio is `FrequencyStepHertz` and
for the same two numbers in its Configurer.
The rest of N1MM's action macros — the CAT families, audio, rotators, stereo,
call stacking, the digital TNC macros — are read and passed over, so a message
that holds one still sends the right characters.
the digital TNC macros — are read and passed over, so a message that holds one
still sends the right characters.
### ESM — Enter sends the message
@@ -204,6 +205,41 @@ Ctrl+? switches between them, and F1 puts you into run mode, as in N1MM.
Two lights sit beside them: the left one is green while a radio is answering,
the right one red while something is going out on the air.
### Call stacking
A CQ is answered by more than one station at a time. Rather than ask the others
to call again, put them on the call stack and work them one after another. This
is N1MM's single-operator call stacking, with N1MM's keys.
| Key | Macro | What it does |
|---|---|---|
| Ctrl+Alt+G | `{STACKANOTHER}` | puts the call being typed on the stack and clears the boxes, so the next caller can be copied |
| Alt+G | | the call on top of the stack replaces what is typed |
| Alt+D | | drops the call on top without working it |
| | `{SOCALLSTACK}` | one key that both stacks and unstacks: it swaps the call being typed for the one on top, stacks it when the stack is empty, and takes the top call when the boxes are |
| | `{LOGTHENPOP}`, `{LOGTHENNEXT}` | logs the contact and brings the next caller into the boxes in one key |
| | `{CLRSTACK}` | empties the stack |
Stacking only works while running: a station you are chasing is worked now, not
later. A dupe is not stacked, nor is your own call, nor a frequency typed into
the callsign box. `{SOCALLSTACK}` takes the stacked call off before it puts the
typed one on, so a multiplier you have just typed cannot come straight back into
the boxes.
A call that would bring a multiplier goes to the front of the stack and the rest
to the back, which is the order N1MM uses on CW and phone. N1MM's digital window
also offers plain first-in-first-out and last-in-first-out; there is no digital
window here, so every mode gets that one order.
The stack window opens by itself when the first call goes on and closes when the
last one comes off, or **Window ▸ Call Stack** opens it. The next call out is
ringed, and each is coloured by what working it would bring, as everywhere else.
Double-click a call to bring it to the front, right-click to drop it.
What is not here: N1MM's ESM "next call key" setting, which picks the function
key ESM sends when a contact is logged with calls still stacked, and passing
stacked calls to the other stations of a multi-operator entry.
### The buttons and the title bar
The twelve function keys sit in two rows of six, with the row of actions under
@@ -214,9 +250,10 @@ them. Each row fills the width, and the first button of the action row takes the
The action row is N1MM's: Esc: Stop, Wipe, Log It, Edit, Spot It and QRZ, each
doing what its key does. QRZ opens the callsign's page in a browser.
N1MM's other two buttons are not there. Mark puts a `Busy@` marker on your own
bandmap at the frequency you are on, which needs a bandmap entry that is not a
station. Store is call stacking, which is not here either.
N1MM's other two buttons are not there. Both put something on your own bandmap
rather than on the cluster: Mark leaves a `Busy@` marker at the frequency you
are on, which needs a bandmap entry that is not a station, and Store puts the
call being typed there so you can come back to it.
The title bar says what N1MM's says: the frequency, the mode, whether the
frequency came from a radio or was typed, and which radio the window belongs to