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:
@@ -34,6 +34,12 @@ func TestProfileSwitchReappliesEveryStartupDevice(t *testing.T) {
|
||||
// sweepers. Its settings do follow the profile: reloadAfterProfileSwitch
|
||||
// calls applyAutoCall, which re-reads them and clears the target.
|
||||
"startAutoCall": "a single sweeper goroutine; applyAutoCall in the reload carries the settings",
|
||||
// The elements and the frequency plan are FILES, shared by every
|
||||
// profile — there is one sky. What is per profile (the favourites, the
|
||||
// minimum elevation, the locator) is read live on every call, so a
|
||||
// switch is already reflected without rebuilding anything. The tracker,
|
||||
// which does transmit, IS stopped by reloadAfterProfileSwitch.
|
||||
"startSatellites": "one sky: the elements and the plan are shared files, and the per-profile settings are read live",
|
||||
}
|
||||
|
||||
startup := body(t, string(src), "func (a *App) startup(ctx context.Context) {")
|
||||
|
||||
Reference in New Issue
Block a user