Fix multi-port device discovery by accumulating universes

Multi-port ArtNet devices (like PD8000) send separate ArtPollReply
packets for each group of 4 ports. Previously we overwrote universes
on each reply; now we accumulate them.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2025-12-24 12:28:09 -08:00
parent b372815892
commit 2cde5b255b
2 changed files with 16 additions and 4 deletions

View File

@@ -153,14 +153,28 @@ func (d *Discovery) HandlePollReply(src *net.UDPAddr, pkt *PollReplyPacket) {
Port: pkt.Port, // Use port from packet, not UDP source port Port: pkt.Port, // Use port from packet, not UDP source port
} }
d.nodes[ip] = node d.nodes[ip] = node
log.Printf("[artnet] discovered ip=%s name=%s universes=%v", ip, shortName, universes) log.Printf("[artnet] discovered ip=%s name=%s", ip, shortName)
} }
node.ShortName = shortName node.ShortName = shortName
node.LongName = longName node.LongName = longName
node.Universes = universes
node.LastSeen = time.Now() node.LastSeen = time.Now()
node.CanTransmit = true node.CanTransmit = true
// Accumulate universes from multiple ArtPollReply packets
// (multi-port devices send separate replies for each group of 4 ports)
for _, u := range universes {
found := false
for _, existing := range node.Universes {
if existing == u {
found = true
break
}
}
if !found {
node.Universes = append(node.Universes, u)
}
}
} }
// HandlePoll processes an incoming ArtPoll and responds // HandlePoll processes an incoming ArtPoll and responds

View File

@@ -297,8 +297,6 @@ func (a *App) sendOutputs(outputs []remap.Output) {
func init() { func init() {
log.SetFlags(log.Ltime | log.Lmicroseconds) log.SetFlags(log.Ltime | log.Lmicroseconds)
fmt.Println("artmap - ArtNet Remapping Proxy")
fmt.Println()
} }
// parseListenAddr parses listen address formats: // parseListenAddr parses listen address formats: