chore: release v0.23.3
This commit is contained in:
+38
-16
@@ -70,6 +70,15 @@ type Kenwood struct {
|
||||
curFreq int64
|
||||
curRXFreq int64
|
||||
curVFO string // "A" or "B"
|
||||
// Split is confirmed with FR;/FT; because IF's split bit is empty on some
|
||||
// Kenwood-dialect rigs — but that check is THROTTLED so it doesn't run every
|
||||
// poll: the two extra commands tripled the poll time on a slow K3 and made the
|
||||
// frequency (read from IF at the top of the poll) lag by seconds. Between
|
||||
// checks the last result stands.
|
||||
splitCheckAt time.Time
|
||||
splitCached bool
|
||||
splitVFOCached string
|
||||
keyWPM int // CW keyer speed, for pacing the KY buffer (see kenwood_cw.go)
|
||||
// Commands this rig answered "?;" to — asked once, then never again.
|
||||
unsupported map[string]bool
|
||||
|
||||
@@ -269,18 +278,31 @@ func (k *Kenwood) ReadState() (RigState, error) {
|
||||
// this costs two short commands per poll only where it actually works.
|
||||
split := f.Split
|
||||
if !split {
|
||||
rxv, rxOK := k.askVFO("FR;")
|
||||
txv, txOK := k.askVFO("FT;")
|
||||
if rxOK && txOK && rxv != txv {
|
||||
// Confirm with FR;/FT; only once a second, not every poll. Running the two
|
||||
// extra commands each cycle tripled the poll time on a slow K3, so the
|
||||
// frequency — already read from IF above — only surfaced every couple of
|
||||
// seconds. Between checks the last FR/FT result stands.
|
||||
if time.Since(k.splitCheckAt) >= time.Second {
|
||||
k.splitCheckAt = time.Now()
|
||||
k.splitCached, k.splitVFOCached = false, ""
|
||||
rxv, rxOK := k.askVFO("FR;")
|
||||
txv, txOK := k.askVFO("FT;")
|
||||
if rxOK && txOK && rxv != txv {
|
||||
k.splitCached = true
|
||||
// Trust FR over IF for which VFO is in use: they were asked in the
|
||||
// same breath, and a rig that leaves the split bit empty may be just
|
||||
// as vague about the VFO field. The block below picks the TRANSMIT
|
||||
// VFO as "the other one" from f.VFO, so leaving them disagreeing
|
||||
// would read the transmit frequency off the wrong dial.
|
||||
if rxv == "A" || rxv == "B" {
|
||||
k.splitVFOCached = rxv
|
||||
}
|
||||
}
|
||||
}
|
||||
if k.splitCached {
|
||||
split = true
|
||||
// Trust FR over IF for which VFO is in use: they were asked in the
|
||||
// same breath, and a rig that leaves the split bit empty may be just
|
||||
// as vague about the VFO field.
|
||||
// f.VFO too, not just the reported state: the block below picks the
|
||||
// TRANSMIT VFO as "the other one" from f.VFO, and leaving the two
|
||||
// disagreeing would read the transmit frequency off the wrong dial.
|
||||
if rxv == "A" || rxv == "B" {
|
||||
k.curVFO, s.Vfo, f.VFO = rxv, rxv, rxv
|
||||
if k.splitVFOCached != "" {
|
||||
k.curVFO, s.Vfo, f.VFO = k.splitVFOCached, k.splitVFOCached, k.splitVFOCached
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -529,11 +551,11 @@ func kenwoodModeDigit(mode string, hz int64) byte {
|
||||
}
|
||||
return '2'
|
||||
}
|
||||
// Any other digital mode rides on the data sideband, which on Kenwood is
|
||||
// plain USB/LSB with the rig's DATA input selected.
|
||||
if hz > 0 && hz < 10_000_000 {
|
||||
return '1'
|
||||
}
|
||||
// Any other digital mode (FT8, PSK, JT…) rides the DATA input, and by universal
|
||||
// convention that is ALWAYS the UPPER sideband, on every band. The SSB rule
|
||||
// (LSB below 10 MHz) must NOT be applied here: doing so put a 40/80 m data spot
|
||||
// on LSB, which an Elecraft K3 shows as "DATA REV" — the reversed sideband.
|
||||
// (RTTY/FSK is handled above as its own FSK mode, so it isn't affected.)
|
||||
return '2'
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user