Update for new artnet discovery API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2
go.mod
2
go.mod
@@ -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
4
go.sum
@@ -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
68
main.go
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user