Two entry windows and an SO2R box
LoggingSession mixed two things: the contest, which one station has one of, and what the operator is typing, which belongs to a radio. It is now ContestSession and RadioPosition. Two positions share one log, one score and one run of serial numbers, so a station worked on radio 1 is a dupe on radio 2. Frequency, mode, split, what is typed and whether you are running belong to each radio on its own. A second radio opens a second entry window. It has no menu of its own: it is another view of the same contest, not another program. Only the window for radio 1 opens the database and the connections. Ctrl+Tab moves the operator to the other radio and the keyboard follows. Ctrl+Shift+Tab puts both radios in the headphones. OtrspBox speaks OTRSP to an SO2R box over a serial port: TX1/TX2 for the key, RX1/RX2 and RX1S for the headphones, AUXnnn for an output line. It follows the active radio, and every message points the box at this radio before keying, so a message cannot go out of the radio the operator has just left. A command that would change nothing is not sent, because the box works relays; N1MM does the same. The box takes a Stream, so what it sends is tested without a serial port. Still missing: alternating CQ, and voice keying on the second radio. Looked at under Xvfb with two fake radios, one of them split: both windows up, radio 1 showing 14008.00 into 14020.0, radio 2 on 14030.00, Ctrl+Tab moving the keyboard between them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
19
src/Nonemm.Rig/So2rBox.cs
Normal file
19
src/Nonemm.Rig/So2rBox.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
namespace Nonemm.Rig;
|
||||
|
||||
/// The box between the operator and two radios: it decides which radio the
|
||||
/// transmitter and the key reach, and which one the headphones hear. Without a
|
||||
/// box the operator does that with switches, and the logger only has to keep
|
||||
/// track of which radio it is on.
|
||||
public interface So2rBox : IDisposable
|
||||
{
|
||||
/// Points the transmitter and the key at one radio.
|
||||
Task SetTransmitAsync(int radioNumber, CancellationToken cancellation = default);
|
||||
|
||||
/// Points the headphones at one radio, or at both when `bothRadios` is set,
|
||||
/// which is how an operator listens to the second radio while the first is
|
||||
/// sending.
|
||||
Task SetReceiveAsync(int radioNumber, bool bothRadios = false, CancellationToken cancellation = default);
|
||||
|
||||
/// Sets a box output, which is usually an antenna or band-decoder line.
|
||||
Task SetAuxiliaryAsync(int radioNumber, int code, CancellationToken cancellation = default);
|
||||
}
|
||||
Reference in New Issue
Block a user