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) } }