fix(icom): say when a radio has no scope stream instead of drawing nothing
The CI-V trace settles it: the IC-7851 answers 27 10 01 with FB and 27 14 00 with its mode, but refuses 27 11 in BOTH shapes — it controls its scope over CI-V and never streams it. Its last firmware is from 2016, older than the waveform stream itself; Hamlib's caps claim otherwise, the radio is the authority. Rejected both ways is a permanent answer, so it is remembered and reported: the panadapter says the radio does not send its scope, which is the one thing a black rectangle could not say.
This commit is contained in:
+25
-11
@@ -93,15 +93,18 @@ type IcomSerial struct {
|
||||
// leading main/sub selector byte (IC-7610/9700). scopeAmp is the latest
|
||||
// reassembled sweep; scopeMu guards it (written by the scope goroutine, read
|
||||
// via ScopeData from the binding goroutine).
|
||||
dualScope bool
|
||||
scopeMu sync.Mutex
|
||||
scopeAmp []byte
|
||||
scopeLow int64 // spectrum left-edge frequency (from the sweep's header frame)
|
||||
scopeHigh int64 // spectrum right-edge frequency
|
||||
scopeSeq int
|
||||
scopeOn bool
|
||||
scopeFixed bool // true = fixed-span mode (tracked optimistically)
|
||||
scopeSeen bool // logged the first sweep's structure once (on-rig verification)
|
||||
dualScope 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
|
||||
scopeMu sync.Mutex
|
||||
scopeAmp []byte
|
||||
scopeLow int64 // spectrum left-edge frequency (from the sweep's header frame)
|
||||
scopeHigh int64 // spectrum right-edge frequency
|
||||
scopeSeq int
|
||||
scopeOn bool
|
||||
scopeFixed bool // true = fixed-span mode (tracked optimistically)
|
||||
scopeSeen bool // logged the first sweep's structure once (on-rig verification)
|
||||
|
||||
curFreq int64 // last frequency read (for sideband choice)
|
||||
curModeByte byte // last raw Icom mode byte (for filter re-send)
|
||||
@@ -1058,7 +1061,17 @@ func (b *IcomSerial) SetScope(on bool) error {
|
||||
// the ONLY thing we switch off on disable, so the radio's own scope display is
|
||||
// left exactly as the operator had it.
|
||||
if err := b.execScope("data output", civ.SubScopeOn, boolByte(on)); err != nil {
|
||||
applog.Printf("icom scope: output on=%v ack: %v — turn the CI-V trace on (Settings → CAT) and send the log", on, err)
|
||||
applog.Printf("icom scope: output on=%v ack: %v", on, err)
|
||||
// Rejected in both shapes = the command does not exist on this rig, which
|
||||
// is a permanent answer and not a bad guess on our part. Remember it: the
|
||||
// panel can then say so, and we stop asking a radio that has already
|
||||
// said no.
|
||||
if strings.Contains(err.Error(), "rejected") {
|
||||
applog.Printf("icom scope: %s does not stream its scope over CI-V — control commands only", b.model)
|
||||
b.scopeMu.Lock()
|
||||
b.scopeUnsupported = true
|
||||
b.scopeMu.Unlock()
|
||||
}
|
||||
}
|
||||
b.scopeMu.Lock()
|
||||
b.scopeOn = on
|
||||
@@ -1302,7 +1315,8 @@ func (b *IcomSerial) ScopeData() ScopeSweep {
|
||||
for i, v := range b.scopeAmp {
|
||||
amp[i] = int(v)
|
||||
}
|
||||
return ScopeSweep{Amp: amp, Seq: b.scopeSeq, LowHz: b.scopeLow, HighHz: b.scopeHigh, Fixed: b.scopeFixed}
|
||||
return ScopeSweep{Amp: amp, Seq: b.scopeSeq, LowHz: b.scopeLow, HighHz: b.scopeHigh, Fixed: b.scopeFixed,
|
||||
Unsupported: b.scopeUnsupported}
|
||||
}
|
||||
|
||||
// exec sends a set command and waits for the rig's OK (FB) / NG (FA) ack.
|
||||
|
||||
Reference in New Issue
Block a user