feat(sat): Doppler tracking on the radio
The hard part of satellite tuning is not the arithmetic, it is deciding who owns the dial. A tracker that forces both frequencies fights the operator every time they turn the knob to follow a station across a linear transponder; one that never touches the receiver leaves them chasing a signal that slides nine kilohertz across a 70 cm pass. So the operator owns the receiver and the tracker follows them. Every second it asks the radio where the receiver actually is. Where it put it, nothing has changed. Further than a dial-turn's tolerance, and the operator has chosen a station: what they landed on is converted back into a nominal frequency, and the transmitter is derived from that. Which is the division of labour on a linear bird — the operator listens, the radio does the sums. Three ways to reach the radio, because a satellite pair is a shape of operating rather than a manufacturer's feature. An IC-9700 or IC-9100 is asked for its OWN satellite mode: it pairs main and sub, gives full duplex, and keeps the dials linked the way its designers meant, which is always better than an imitation built out of split. A Flex gets two slices, A the downlink and B the uplink, created when missing, because "slice B does not exist" is not something to make an operator fix at the start of a ten-minute pass. Everything else gets the downlink, and is told so — half the job announced beats half the job hidden. What goes in the log is the NOMINAL pair. Two stations working each other through a transponder read different numbers off their dials at the same instant; the only figure they can both agree on is the transponder's own. FREQ is the uplink and FREQ_RX the downlink — the one place a satellite QSO differs from every other kind, and the reason FREQ alone cannot describe one.
This commit is contained in:
@@ -94,6 +94,13 @@ type IcomSerial struct {
|
||||
// reassembled sweep; scopeMu guards it (written by the scope goroutine, read
|
||||
// via ScopeData from the binding goroutine).
|
||||
dualScope bool
|
||||
// satNative marks the two-band satellite rigs — the IC-9700 and the IC-9100 —
|
||||
// which have a real satellite mode of their own. Everything else gets the
|
||||
// downlink and, where the uplink is reachable, split.
|
||||
satNative bool
|
||||
// satOn tracks what we last told the rig, so TuneSatellite can arm the mode
|
||||
// once rather than on every Doppler step.
|
||||
satOn bool
|
||||
// Set when the rig rejects the waveform-output command in both shapes: it has
|
||||
// no stream to give, and asking again on every enable is noise.
|
||||
scopeUnsupported bool
|
||||
@@ -284,6 +291,10 @@ func (b *IcomSerial) Connect() error {
|
||||
// non-default address still RENDERS; this flag only drives the SET/read commands
|
||||
// (mode, span, edges), which need the 0x00 selector to be accepted on the 7300.
|
||||
b.dualScope = idAddr == 0x98 || idAddr == 0xA2 || idAddr == 0x94
|
||||
// The satellite rigs: IC-9700 and IC-9100. Both carry two receivers on two
|
||||
// bands and a satellite mode that pairs them; no other Icom in this table
|
||||
// does, and asking one that does not is a rejected frame per Doppler step.
|
||||
b.satNative = idAddr == 0xA2 || idAddr == 0x7C
|
||||
// Silence any LEFTOVER waveform stream, BLIND, before anything else. The
|
||||
// 0x27 output flag lives in the RADIO and survives sessions; its flood is
|
||||
// what makes the IC-7760 stop answering CI-V — so waiting for CI-V to
|
||||
|
||||
Reference in New Issue
Block a user