fix(elecraft): read the SWR as three digits, not four

Elecraft's release note settles it: SW; returns the most recent reading in
transmit or TUNE as three digits in tenths of a ratio — SW023 is 2.3:1,
and SW999 is the 99.9:1 it reports instead of infinity.

This asked for four, so every answer failed to parse and the bar stayed
empty for the whole transmission. A tester saw exactly that: no SWR at
all, which reads as an unsupported radio rather than an off-by-one.

SW also comes out of the probe list. It is known now, and asking again
mid-transmission costs a round trip on the link the carrier depends on.
This commit is contained in:
2026-08-25 23:58:20 +02:00
parent 4441b16699
commit 8e0865a71f
2 changed files with 16 additions and 6 deletions
+12 -4
View File
@@ -15,6 +15,10 @@ package cat
// good match on a bad antenna. So the raw answers are LOGGED, for a real
// radio to settle, and until then the panel says the scaling is provisional.
//
// SWR is settled: SW; answers three digits in tenths of a ratio ("SW023;" =
// 2.3:1), from Elecraft's release note. The power meter is still read from the
// bargraph and still provisional.
//
// The same discipline as the Yaesu meters, which were guessed wrong twice and
// only settled when an FTDX10 keyed a carrier at two known power levels.
@@ -309,7 +313,9 @@ func kenwoodAGCValue(name string) int {
// answered and what it said, next to the power SETTING: the meter that tracks a
// known carrier at two different power levels is the power meter, and no amount
// of reading the reference settles that as well as one transmission does.
var kenwoodMeterProbes = []string{"SM;", "SMH;", "BG;", "SW;", "PO;", "TQ;"}
// SW is no longer among them: it is known, read above, and asking again during
// a transmission costs a round trip on the one link the carrier depends on.
var kenwoodMeterProbes = []string{"SM;", "SMH;", "BG;", "PO;", "TQ;"}
// readTXMeters reads the transmit meters.
func (k *Kenwood) readTXMeters() {
@@ -321,10 +327,12 @@ func (k *Kenwood) readTXMeters() {
if v, ok := k.askNum("BG;", "BG", 2); ok {
k.panel.PowerMeter = k.powerPeak.update(kenwoodBargraphPercent(v), now)
}
if v, ok := k.askNum("SW;", "SW", 4); ok {
// SW; — SETTLED, from Elecraft's own release note: three digits, tenths of a
// ratio. "SW023;" is 2.3:1, and "SW999;" is the 99.9:1 it reports instead of
// infinity. This was reading FOUR digits, so every answer failed to parse
// and the bar stayed empty — which is why a tester saw no SWR at all.
if v, ok := k.askNum("SW;", "SW", 3); ok {
k.panel.SWRRaw = v
// Tenths of a ratio, provisionally: 15 → 1.5. Reported as raw as well,
// so the log can correct this without anyone having to trust the bar.
if v > 0 {
k.panel.SWR = float64(k.swrPeak.update(v, now)) / 10
}