Initial Art-Net protocol library

This commit is contained in:
Ian Gulliver
2026-01-28 10:27:25 -08:00
commit e02ba0cd5e
6 changed files with 868 additions and 0 deletions

71
sender.go Normal file
View File

@@ -0,0 +1,71 @@
package artnet
import (
"net"
"sync"
)
type Sender struct {
conn *net.UDPConn
sequences map[Universe]uint8
seqMu sync.Mutex
}
func NewSender() (*Sender, error) {
conn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0})
if err != nil {
return nil, err
}
return &Sender{
conn: conn,
sequences: map[Universe]uint8{},
}, nil
}
func NewSenderFromConn(conn *net.UDPConn) *Sender {
return &Sender{
conn: conn,
sequences: map[Universe]uint8{},
}
}
func (s *Sender) SendDMX(addr *net.UDPAddr, universe Universe, data []byte) error {
s.seqMu.Lock()
seq := s.sequences[universe]
seq++
if seq == 0 {
seq = 1
}
s.sequences[universe] = seq
s.seqMu.Unlock()
pkt := BuildDMXPacket(universe, seq, data)
_, err := s.conn.WriteToUDP(pkt, addr)
return err
}
func (s *Sender) SendPoll(addr *net.UDPAddr) error {
pkt := BuildPollPacket()
_, err := s.conn.WriteToUDP(pkt, addr)
return err
}
func (s *Sender) SendPollReply(addr *net.UDPAddr, localIP [4]byte, localMAC [6]byte, shortName, longName string, universes []Universe, isInput bool) error {
pkt := BuildPollReplyPacket(localIP, localMAC, shortName, longName, universes, isInput)
_, err := s.conn.WriteToUDP(pkt, addr)
return err
}
func (s *Sender) SendRaw(addr *net.UDPAddr, data []byte) error {
_, err := s.conn.WriteToUDP(data, addr)
return err
}
func (s *Sender) Close() error {
return s.conn.Close()
}
func (s *Sender) LocalAddr() net.Addr {
return s.conn.LocalAddr()
}