fix(cat-share): answer get_freq with the listening VFO, not the transmit one
Reported from a station running an IC-7850 over USB: with split engaged,
turning VFO B moved VFO A slightly. OpsLog writes nothing to that radio on
its own — but it shares it, and what it was sharing was wrong.
Hamlib's 'f' means the VFO IN USE. RigState follows ADIF, where FreqHz is
where we TRANSMIT, and the two are the same number until split is
engaged — so the adapter handed FreqHz over unchanged and every client
asking for the dial was given VFO B. A client that reads the dial and
writes it back, which is what WSJT-X and its like do, then wrote VFO B's
frequency into VFO A. Hence a shift the size of the split offset, and
hence 'it did not do this before': it only happens with split on.
get_split_freq ('i') already answers the transmit frequency and is
untouched. The one-line rule is lifted into shareRXFreq with a test that
includes this case, the simplex case, and a backend that reports split
without ever filling in the receive frequency — which would otherwise
answer a client with 0 Hz.
This commit is contained in:
@@ -20075,7 +20075,27 @@ func (a *App) IsNewUSCounty(state, cnty string) bool {
|
||||
// native ones: an operator on OmniRig or Flex gets the same server.
|
||||
type catShareRig struct{ a *App }
|
||||
|
||||
func (r catShareRig) Freq() int64 { return r.a.cat.State().FreqHz }
|
||||
// Freq is what a rigctl client gets for "f": the frequency of the VFO in use,
|
||||
// which is where we LISTEN.
|
||||
//
|
||||
// This returned FreqHz, and RigState follows ADIF where FreqHz is the TRANSMIT
|
||||
// frequency — so with split on, every client asking "what frequency is the
|
||||
// radio on" was told VFO B. Reported from a station running an IC-7850: turning
|
||||
// VFO B moved VFO A. Nothing in OpsLog was writing to the radio; a client was
|
||||
// reading the dial, being handed the wrong VFO, and writing it back.
|
||||
//
|
||||
// The split TX frequency is a separate question, and Hamlib has a separate
|
||||
// command for it ("i" / get_split_freq) which Split() below answers.
|
||||
func (r catShareRig) Freq() int64 { return shareRXFreq(r.a.cat.State()) }
|
||||
|
||||
// shareRXFreq is that rule on its own, so it can be pinned by a test: it is one
|
||||
// line, it was wrong, and being wrong cost a station its VFO A.
|
||||
func shareRXFreq(st cat.RigState) int64 {
|
||||
if st.Split && st.RxFreqHz > 0 {
|
||||
return st.RxFreqHz
|
||||
}
|
||||
return st.FreqHz
|
||||
}
|
||||
func (r catShareRig) Mode() string { return r.a.cat.State().Mode }
|
||||
|
||||
// Split reports the flag and the OTHER VFO's frequency. RigState follows ADIF —
|
||||
|
||||
Reference in New Issue
Block a user