fix(icom): the client pings too — the dropouts' likely root cause
wfview sends a ping (0x07, 0x15 bytes, its own seq and a monotonic timestamp) every 500 ms on every stream, and so does RS-BA1. OpsLog only ever REPLIED to the rig's pings — and the loaner IC-7760 stopped serving CI-V data about a minute into nearly every session while the transport stayed alive: the rig had concluded nobody was listening. Scope, TX audio and idle numbering were each eliminated in turn before wfview's source settled it. Pings now go out on control, CI-V and audio alike.
This commit is contained in:
@@ -57,7 +57,9 @@ type icomAudio struct {
|
||||
rxLastSeq uint16
|
||||
rxMissing map[uint16]int
|
||||
|
||||
dumped int // packets hex-dumped so far (≤ icaDumpFirst)
|
||||
dumped int // packets hex-dumped so far (≤ icaDumpFirst)
|
||||
pingSeq uint16 // client-ping counter — the rig wants OUR pings too (see icnPing)
|
||||
started time.Time
|
||||
|
||||
// Live-TX state — see SendTXChunk.
|
||||
txMu sync.Mutex
|
||||
@@ -109,6 +111,7 @@ func dialIcomAudio(host string, sink func([]byte), cancel <-chan struct{}) (*ico
|
||||
_ = conn.SetReadBuffer(1 << 20)
|
||||
a := &icomAudio{
|
||||
conn: conn, aID: aID, aRemote: aRemote,
|
||||
started: time.Now(),
|
||||
sink: sink,
|
||||
rxMissing: make(map[uint16]int),
|
||||
done: make(chan struct{}),
|
||||
@@ -124,6 +127,7 @@ func dialIcomAudio(host string, sink func([]byte), cancel <-chan struct{}) (*ico
|
||||
func (a *icomAudio) audioPump() {
|
||||
buf := make([]byte, 8192)
|
||||
lastIdle := time.Now()
|
||||
lastPing := time.Now()
|
||||
lastReq := time.Now()
|
||||
for {
|
||||
select {
|
||||
@@ -163,6 +167,11 @@ func (a *icomAudio) audioPump() {
|
||||
_, _ = a.conn.Write(icnCtrl(0x00, 0, a.aID, a.aRemote))
|
||||
lastIdle = time.Now()
|
||||
}
|
||||
if time.Since(lastPing) > 500*time.Millisecond {
|
||||
a.pingSeq++
|
||||
_, _ = a.conn.Write(icnPing(a.pingSeq, a.aID, a.aRemote, uint32(time.Since(a.started).Milliseconds())))
|
||||
lastPing = time.Now()
|
||||
}
|
||||
if time.Since(lastReq) > 100*time.Millisecond {
|
||||
a.sendRetransmitReq()
|
||||
lastReq = time.Now()
|
||||
|
||||
Reference in New Issue
Block a user