fix: IC-7610 VFO A over OmniRig + faster Icom LAN reconnect
OmniRig: on the IC-7610 the generic Freq property reports the wrong VFO (its Main/Sub model confuses the stock ini), so OpsLog showed VFO B. Detect the rig by RigType and, in simplex, read VFO A explicitly — matching Log4OM. Only the 7610 is affected; other rigs keep using the generic Freq. Icom network: when the rig tears the session down (control/CI-V 0x05) OpsLog only logged it and kept the half-dead link until the 6 s liveness timeout expired. Mark the link dead on 0x05 so Alive() fails on the next poll and the manager reconnects cleanly right away.
This commit is contained in:
@@ -136,6 +136,11 @@ type icomNet struct {
|
||||
// but link fine" (stay connected) from "link dead" (reconnect). See Alive().
|
||||
lastRx atomic.Int64
|
||||
|
||||
// dead is set when the rig explicitly tears the session down (control 0x05):
|
||||
// Alive() then returns false immediately so ReadState fails on the next poll and
|
||||
// the manager reconnects cleanly, instead of waiting out the 6 s lastRx timeout.
|
||||
dead atomic.Bool
|
||||
|
||||
// audio is the optional RX audio stream (UDP 50003). nil when audio is off.
|
||||
// Torn down alongside the CI-V/control streams in Close.
|
||||
audio *icomAudio
|
||||
@@ -178,6 +183,9 @@ func (n *icomNet) markRx() { n.lastRx.Store(time.Now().UnixNano()) }
|
||||
// the radio — is gone. Independent of CI-V replies, so a powered-off rig still
|
||||
// reads as Alive and the session isn't torn down. Satisfies aliveTransport.
|
||||
func (n *icomNet) Alive() bool {
|
||||
if n.dead.Load() {
|
||||
return false // rig sent an explicit disconnect — reconnect now, don't wait
|
||||
}
|
||||
last := n.lastRx.Load()
|
||||
if last == 0 {
|
||||
return true // just connected, nothing received yet — give it a chance
|
||||
@@ -292,6 +300,7 @@ func (n *icomNet) ctrlPump() {
|
||||
n.ctrlResend(icnLE.Uint16(buf[6:]))
|
||||
}
|
||||
case 0x05: // rig-initiated disconnect — it dropped US
|
||||
n.dead.Store(true) // make Alive() fail now → prompt clean reconnect
|
||||
debugLog.Printf("icom net: rig sent DISCONNECT on control stream — session dropped by the rig")
|
||||
default:
|
||||
// Anything else on the control stream is (almost always) the rig's
|
||||
@@ -367,6 +376,7 @@ func (n *icomNet) civPump() {
|
||||
n.resend(icnLE.Uint16(buf[6:]))
|
||||
}
|
||||
case typ == 0x05: // rig-initiated disconnect — it dropped US
|
||||
n.dead.Store(true) // make Alive() fail now → prompt clean reconnect
|
||||
debugLog.Printf("icom net: rig sent DISCONNECT on CI-V stream — session dropped by the rig")
|
||||
case typ == 0x00 && k > 0x15 && buf[0x10] == 0xc1: // CI-V data
|
||||
n.trackRxSeq(icnLE.Uint16(buf[6:])) // note gaps for retransmit
|
||||
|
||||
Reference in New Issue
Block a user