Files
artnet-go/artnet.go
2026-01-31 15:54:36 -06:00

68 lines
1.9 KiB
Go

package artnet
import (
"encoding/binary"
"errors"
"fmt"
)
var (
OpPoll uint16 = 0x2000
OpPollReply uint16 = 0x2100
OpDiagData uint16 = 0x2300
OpCommand uint16 = 0x2400
OpDataRequest uint16 = 0x2700
OpDataReply uint16 = 0x2800
OpOutput uint16 = 0x5000
OpDmx uint16 = 0x5000
OpNzs uint16 = 0x5100
OpSync uint16 = 0x5200
OpAddress uint16 = 0x6000
OpInput uint16 = 0x7000
OpTodRequest uint16 = 0x8000
OpTodData uint16 = 0x8100
OpTodControl uint16 = 0x8200
OpRdm uint16 = 0x8300
OpRdmSub uint16 = 0x8400
OpVideoSetup uint16 = 0xa010
OpVideoPalette uint16 = 0xa020
OpVideoData uint16 = 0xa040
OpMacMaster uint16 = 0xf000
OpMacSlave uint16 = 0xf100
OpFirmwareMaster uint16 = 0xf200
OpFirmwareReply uint16 = 0xf300
OpFileTnMaster uint16 = 0xf400
OpFileFnMaster uint16 = 0xf500
OpFileFnReply uint16 = 0xf600
OpIpProg uint16 = 0xf800
OpIpProgReply uint16 = 0xf900
OpMedia uint16 = 0x9000
OpMediaPatch uint16 = 0x9100
OpMediaControl uint16 = 0x9200
OpMediaContrlReply uint16 = 0x9300
OpTimeCode uint16 = 0x9700
OpTimeSync uint16 = 0x9800
OpTrigger uint16 = 0x9900
OpDirectory uint16 = 0x9a00
OpDirectoryReply uint16 = 0x9b00
)
var ArtNetID []uint8 = []uint8{'A', 'r', 't', '-', 'N', 'e', 't', 0x00}
func Decode(bytes []byte) (ArtNetPacket, error) {
if len(bytes) < 12 {
return nil, errors.New("ArtNet packet must be at least 12 bytes")
}
opCode := binary.LittleEndian.Uint16(bytes[8:10])
switch opCode {
case OpPoll:
return NewArtPoll(bytes)
case OpDmx:
return NewArtDmx(bytes)
case OpTimeCode:
return NewArtTimeCode(bytes)
default:
return nil, fmt.Errorf("unhandled opcode: %#x", opCode)
}
}