debug(icom): say what the CI-V stream was doing when it goes quiet
A real IC-7760 keeps going silent on the CI-V stream two-three minutes into a session while the control link stays alive. At 10 s of silence the pump now logs the last real socket error and the retransmit backlog, and notes when the stream resumes — the 30 s watchdog that follows cannot tell a dead socket from a rig that stopped talking, and the next occurrence should.
This commit is contained in:
+24
-1
@@ -359,6 +359,14 @@ func (n *icomNet) civPump() {
|
|||||||
buf := make([]byte, 8192)
|
buf := make([]byte, 8192)
|
||||||
lastIdle := time.Now()
|
lastIdle := time.Now()
|
||||||
lastReq := time.Now()
|
lastReq := time.Now()
|
||||||
|
// Diagnosis for the recurring 2-3-minute silence a real IC-7760 shows on
|
||||||
|
// this stream while the control link stays alive: when the stream has been
|
||||||
|
// quiet for 10 s, say so ONCE, with the last read error — a socket error
|
||||||
|
// and a rig that stopped talking are different repairs, and the 30 s
|
||||||
|
// watchdog that follows cannot tell them apart from where it sits.
|
||||||
|
lastPkt := time.Now()
|
||||||
|
var lastErr error
|
||||||
|
quietSaid := false
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-n.done:
|
case <-n.done:
|
||||||
@@ -366,7 +374,18 @@ func (n *icomNet) civPump() {
|
|||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
_ = n.civ.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
|
_ = n.civ.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
|
||||||
if k, err := n.civ.Read(buf); err == nil && k >= 16 {
|
k, err := n.civ.Read(buf)
|
||||||
|
if err != nil {
|
||||||
|
if e, ok := err.(net.Error); !ok || !e.Timeout() {
|
||||||
|
lastErr = err // a REAL socket error, not the read deadline
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err == nil && k >= 16 {
|
||||||
|
if quietSaid {
|
||||||
|
debugLog.Printf("icom net: CI-V stream is talking again after %s of silence", time.Since(lastPkt).Round(time.Second))
|
||||||
|
quietSaid = false
|
||||||
|
}
|
||||||
|
lastPkt = time.Now()
|
||||||
n.markRx()
|
n.markRx()
|
||||||
switch typ := icnLE.Uint16(buf[4:]); {
|
switch typ := icnLE.Uint16(buf[4:]); {
|
||||||
case typ == 0x07: // ping
|
case typ == 0x07: // ping
|
||||||
@@ -410,6 +429,10 @@ func (n *icomNet) civPump() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if !quietSaid && time.Since(lastPkt) > 10*time.Second {
|
||||||
|
quietSaid = true
|
||||||
|
debugLog.Printf("icom net: CI-V stream quiet for 10 s (control link still alive; last socket error: %v; missing-seq backlog: %d) — idles and retransmit requests are still being sent", lastErr, len(n.rxMissing))
|
||||||
|
}
|
||||||
if time.Since(lastIdle) > 150*time.Millisecond {
|
if time.Since(lastIdle) > 150*time.Millisecond {
|
||||||
_, _ = n.civ.Write(icnCtrl(0x00, 0, n.vID, n.vRemote))
|
_, _ = n.civ.Write(icnCtrl(0x00, 0, n.vID, n.vRemote))
|
||||||
lastIdle = time.Now()
|
lastIdle = time.Now()
|
||||||
|
|||||||
Reference in New Issue
Block a user