Add ArtRDM TOD discovery support

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-31 07:47:23 -08:00
parent 17ab11b048
commit a1431d5274
4 changed files with 142 additions and 10 deletions

View File

@@ -14,6 +14,7 @@ type Node struct {
LongName string
Inputs []Universe
Outputs []Universe
RDMUIDs map[Universe][]RDMUID
LastSeen time.Time
}
@@ -128,8 +129,9 @@ func (d *Discovery) HandlePollReply(src *net.UDPAddr, pkt *PollReplyPacket) {
node, exists := d.nodes[ip]
if !exists {
node = &Node{
IP: src.IP,
Port: pkt.Port,
IP: src.IP,
Port: pkt.Port,
RDMUIDs: map[Universe][]RDMUID{},
}
d.nodes[ip] = node
}
@@ -139,6 +141,7 @@ func (d *Discovery) HandlePollReply(src *net.UDPAddr, pkt *PollReplyPacket) {
node.MAC = pkt.MACAddr()
node.LastSeen = time.Now()
var newOutputs []Universe
for _, u := range pkt.InputUniverses() {
if !containsUniverse(node.Inputs, u) {
node.Inputs = append(node.Inputs, u)
@@ -147,12 +150,45 @@ func (d *Discovery) HandlePollReply(src *net.UDPAddr, pkt *PollReplyPacket) {
for _, u := range pkt.OutputUniverses() {
if !containsUniverse(node.Outputs, u) {
node.Outputs = append(node.Outputs, u)
newOutputs = append(newOutputs, u)
}
}
if d.onChange != nil {
d.onChange(node)
}
if len(newOutputs) > 0 {
go d.requestTod(src, newOutputs)
}
}
func (d *Discovery) requestTod(addr *net.UDPAddr, universes []Universe) {
for _, u := range universes {
d.sender.SendTodRequest(addr, u)
time.Sleep(50 * time.Millisecond)
}
}
func (d *Discovery) HandleTodData(src *net.UDPAddr, pkt *TodDataPacket) {
d.nodesMu.Lock()
defer d.nodesMu.Unlock()
ip := src.IP.String()
node, exists := d.nodes[ip]
if !exists {
return
}
if node.RDMUIDs == nil {
node.RDMUIDs = map[Universe][]RDMUID{}
}
node.RDMUIDs[pkt.Universe] = pkt.UIDs
if d.onChange != nil {
d.onChange(node)
}
}
func (d *Discovery) HandlePoll(src *net.UDPAddr) {