Update for new artnet discovery API

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-30 09:14:05 -08:00
parent 7918b80add
commit fd0d482380
3 changed files with 62 additions and 12 deletions

2
go.mod
View File

@@ -4,7 +4,7 @@ go 1.25.6
require ( require (
github.com/BurntSushi/toml v1.6.0 github.com/BurntSushi/toml v1.6.0
github.com/gopatchy/artnet v0.0.0-20260128203426-0a3e9b1daf66 github.com/gopatchy/artnet v0.0.0-20260130164309-5e7400fe514e
github.com/gopatchy/sacn v0.0.0-20260130055955-54a46fbfe1f0 github.com/gopatchy/sacn v0.0.0-20260130055955-54a46fbfe1f0
) )

4
go.sum
View File

@@ -2,8 +2,8 @@ github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/gopatchy/artnet v0.0.0-20260128203426-0a3e9b1daf66 h1:QZrypvWOUbZeJsFRRx8UXf+MUbvkF/WR2KvNUynWFTM= github.com/gopatchy/artnet v0.0.0-20260130164309-5e7400fe514e h1:KaCtixVKARhtTzqlqWyzXurNACaesAGxjFgnFd3jYT4=
github.com/gopatchy/artnet v0.0.0-20260128203426-0a3e9b1daf66/go.mod h1:V/D32mh1xfK/llCKbrqI2jxw4xL4hf6Ge2yLiIrp9/4= github.com/gopatchy/artnet v0.0.0-20260130164309-5e7400fe514e/go.mod h1:V/D32mh1xfK/llCKbrqI2jxw4xL4hf6Ge2yLiIrp9/4=
github.com/gopatchy/multicast v0.0.0-20260130055828-12d0b38af995 h1:dwu07X0JnN6Ar3oZMLa/BokX04JRa3AeM38Nz7nwKnM= github.com/gopatchy/multicast v0.0.0-20260130055828-12d0b38af995 h1:dwu07X0JnN6Ar3oZMLa/BokX04JRa3AeM38Nz7nwKnM=
github.com/gopatchy/multicast v0.0.0-20260130055828-12d0b38af995/go.mod h1:mSeh6GX+fL6SWZYqxYHTdnddvzDx4qsGSBnlGwY5ZsA= github.com/gopatchy/multicast v0.0.0-20260130055828-12d0b38af995/go.mod h1:mSeh6GX+fL6SWZYqxYHTdnddvzDx4qsGSBnlGwY5ZsA=
github.com/gopatchy/sacn v0.0.0-20260130055955-54a46fbfe1f0 h1:j1uxCRJSu7G8UwlTykIDacbcQY2qoUpZ9t/SBHqLET8= github.com/gopatchy/sacn v0.0.0-20260130055955-54a46fbfe1f0 h1:j1uxCRJSu7G8UwlTykIDacbcQY2qoUpZ9t/SBHqLET8=

68
main.go
View File

@@ -94,12 +94,6 @@ func main() {
} }
} }
// Convert poll targets to slice
pollTargetSlice := make([]*net.UDPAddr, 0, len(pollTargets))
for _, addr := range pollTargets {
pollTargetSlice = append(pollTargetSlice, addr)
}
// Create ArtNet sender // Create ArtNet sender
artSender, err := artnet.NewSender() artSender, err := artnet.NewSender()
if err != nil { if err != nil {
@@ -129,7 +123,15 @@ func main() {
for i, n := range srcNums { for i, n := range srcNums {
outputUnivs[i] = artnet.Universe(n) outputUnivs[i] = artnet.Universe(n)
} }
discovery := artnet.NewDiscovery(artSender, "artmap", "artmap", inputUnivs, outputUnivs, pollTargetSlice)
// Get local interface info for discovery
var localIP, broadcastIP net.IP
var localMAC net.HardwareAddr
if len(broadcasts) > 0 {
broadcastIP = broadcasts[0].IP
localIP, localMAC = detectLocalInterface(broadcastIP)
}
discovery := artnet.NewDiscovery(artSender, localIP, broadcastIP, localMAC, "artmap", "artmap", inputUnivs, outputUnivs)
// Create app // Create app
app := &App{ app := &App{
@@ -183,8 +185,10 @@ func main() {
log.Printf("[sacn] listening universes=%v", sacnUniverses) log.Printf("[sacn] listening universes=%v", sacnUniverses)
} }
// Start discovery // Start discovery only if we have ArtNet outputs
discovery.Start() if len(destNums) > 0 || len(artTargets) > 0 {
discovery.Start()
}
// Wait for interrupt // Wait for interrupt
sigChan := make(chan os.Signal, 1) sigChan := make(chan os.Signal, 1)
@@ -362,6 +366,52 @@ func parseTargetAddr(s string, defaultPort int) (*net.UDPAddr, error) {
return &net.UDPAddr{IP: ip, Port: port}, nil return &net.UDPAddr{IP: ip, Port: port}, nil
} }
// detectLocalInterface returns local IP and MAC for an interface matching the broadcast address
func detectLocalInterface(broadcast net.IP) (net.IP, net.HardwareAddr) {
ifaces, err := net.Interfaces()
if err != nil {
return nil, nil
}
for _, iface := range ifaces {
if iface.Flags&net.FlagLoopback != 0 || iface.Flags&net.FlagUp == 0 {
continue
}
addrs, err := iface.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
ipnet, ok := addr.(*net.IPNet)
if !ok {
continue
}
ip4 := ipnet.IP.To4()
if ip4 == nil {
continue
}
mask := ipnet.Mask
if len(mask) != 4 {
continue
}
bcast := make(net.IP, 4)
for i := 0; i < 4; i++ {
bcast[i] = ip4[i] | ^mask[i]
}
if bcast.Equal(broadcast) {
return ip4, iface.HardwareAddr
}
}
}
return nil, nil
}
// detectBroadcastAddrs returns broadcast addresses for all network interfaces // detectBroadcastAddrs returns broadcast addresses for all network interfaces
func detectBroadcastAddrs() []*net.UDPAddr { func detectBroadcastAddrs() []*net.UDPAddr {
var addrs []*net.UDPAddr var addrs []*net.UDPAddr