diff --git a/command.go b/command.go index 06e1e9c..e952e8b 100644 --- a/command.go +++ b/command.go @@ -19,70 +19,66 @@ type ArtCommand struct { ProtVerHi uint8 ProtVerLo uint8 EstaMan uint16 - Length uint16 Data []uint8 } -func (ap *ArtCommand) GetOpCode() uint16 { - return ap.OpCode +func (ac *ArtCommand) GetOpCode() uint16 { + return ac.OpCode } -func (ap *ArtCommand) GetProtVer() uint16 { - return uint16(ap.ProtVerHi)<<8 + uint16(ap.ProtVerLo) +func (ac *ArtCommand) GetProtVer() uint16 { + return uint16(ac.ProtVerHi)<<8 + uint16(ac.ProtVerLo) } -func (ap *ArtCommand) GetID() [8]uint8 { - return ap.ID +func (ac *ArtCommand) GetID() [8]uint8 { + return ac.ID } -func (ap *ArtCommand) SetData(data string) error { - if len(data) > 512 { - return errors.New("data length must be less than or equal to 512 bytes") - } - ap.Data = make([]uint8, len(data)) - copy(ap.Data, data) - ap.Length = uint16(len(data)) - return nil +func (ac *ArtCommand) Length() uint16 { + return uint16(len(ac.Data)) } -func (ap *ArtCommand) UnmarshalBinary(data []byte) error { +func (ac *ArtCommand) UnmarshalBinary(data []byte) error { if len(data) < 16 { return errors.New("ArtCommand packet must be at least 16 bytes long") } - copy(ap.ID[:], data[0:8]) + copy(ac.ID[:], data[0:8]) - if !slices.Equal(ArtNetID[:], ap.ID[:]) { + if !slices.Equal(ArtNetID[:], ac.ID[:]) { return errors.New("ID does not match Art-Net ID") } - ap.OpCode = binary.LittleEndian.Uint16(data[8:10]) - ap.ProtVerHi = data[10] - ap.ProtVerLo = data[11] + ac.OpCode = binary.LittleEndian.Uint16(data[8:10]) + ac.ProtVerHi = data[10] + ac.ProtVerLo = data[11] offset := 12 - ap.EstaMan = binary.LittleEndian.Uint16(data[offset : offset+2]) - ap.Length = binary.LittleEndian.Uint16(data[offset+2 : offset+4]) + ac.EstaMan = binary.LittleEndian.Uint16(data[offset : offset+2]) - dataLength := int(ap.Length) + dataLength := int(binary.LittleEndian.Uint16(data[offset+2 : offset+4])) if len(data[offset+4:]) < dataLength { return errors.New("[]byte length not long enough to contain data length specified in packet") } - ap.Data = make([]uint8, dataLength) - copy(ap.Data, data[offset+4:offset+4+dataLength]) + ac.Data = make([]uint8, dataLength) + copy(ac.Data, data[offset+4:offset+4+dataLength]) return nil } -func (ap *ArtCommand) MarshalBinary() ([]byte, error) { +func (ac *ArtCommand) MarshalBinary() ([]byte, error) { data := make([]byte, 8+8) - copy(data[0:8], ap.ID[:]) - binary.LittleEndian.PutUint16(data[8:10], ap.OpCode) - data[10] = ap.ProtVerHi - data[11] = ap.ProtVerLo - binary.LittleEndian.PutUint16(data[12:14], ap.EstaMan) - binary.LittleEndian.PutUint16(data[14:16], ap.Length) - data = append(data, ap.Data...) + copy(data[0:8], ac.ID[:]) + binary.LittleEndian.PutUint16(data[8:10], ac.OpCode) + data[10] = ac.ProtVerHi + data[11] = ac.ProtVerLo + binary.LittleEndian.PutUint16(data[12:14], ac.EstaMan) + dataLength := uint16(len(ac.Data)) + if dataLength > 512 { + return nil, errors.New("data length must be less than or equal to 512 bytes") + } + binary.LittleEndian.PutUint16(data[14:16], dataLength) + data = append(data, ac.Data...) return data, nil } diff --git a/diagdata.go b/diagdata.go index 85357c4..a522e34 100644 --- a/diagdata.go +++ b/diagdata.go @@ -25,64 +25,71 @@ type ArtDiagData struct { DiagPriority DiagPriority LogicalPort uint8 filler3 uint8 - Length uint16 Data []uint8 } -func (ap *ArtDiagData) GetOpCode() uint16 { - return ap.OpCode +func (add *ArtDiagData) GetOpCode() uint16 { + return add.OpCode } -func (ap *ArtDiagData) GetProtVer() uint16 { - return uint16(ap.ProtVerHi)<<8 + uint16(ap.ProtVerLo) +func (add *ArtDiagData) GetProtVer() uint16 { + return uint16(add.ProtVerHi)<<8 + uint16(add.ProtVerLo) } -func (ap *ArtDiagData) GetID() [8]uint8 { - return ap.ID +func (add *ArtDiagData) GetID() [8]uint8 { + return add.ID } -func (ap *ArtDiagData) UnmarshalBinary(data []byte) error { +func (add *ArtDiagData) Length() uint16 { + return uint16(len(add.Data)) +} + +func (add *ArtDiagData) UnmarshalBinary(data []byte) error { if len(data) < 18 { return errors.New("ArtDiagData packet must be at least 18 bytes long") } - copy(ap.ID[:], data[0:8]) + copy(add.ID[:], data[0:8]) - if !slices.Equal(ArtNetID[:], ap.ID[:]) { + if !slices.Equal(ArtNetID[:], add.ID[:]) { return errors.New("ID does not match Art-Net ID") } - ap.OpCode = binary.LittleEndian.Uint16(data[8:10]) - ap.ProtVerHi = data[10] - ap.ProtVerLo = data[11] + add.OpCode = binary.LittleEndian.Uint16(data[8:10]) + add.ProtVerHi = data[10] + add.ProtVerLo = data[11] offset := 12 - ap.filler1 = data[offset] - ap.DiagPriority = DiagPriority(data[offset+1]) - ap.LogicalPort = data[offset+2] - ap.filler3 = data[offset+3] - ap.Length = binary.LittleEndian.Uint16(data[offset+4 : offset+6]) + add.filler1 = data[offset] + add.DiagPriority = DiagPriority(data[offset+1]) + add.LogicalPort = data[offset+2] + add.filler3 = data[offset+3] + dataLength := binary.LittleEndian.Uint16(data[offset+4 : offset+6]) - if len(data[offset+6:]) < int(ap.Length) { + if len(data[offset+6:]) < int(dataLength) { return errors.New("[]byte length not long enough to contain data length specified in packet") } - ap.Data = make([]uint8, ap.Length) - copy(ap.Data, data[offset+6:offset+6+int(ap.Length)]) + add.Data = make([]uint8, dataLength) + copy(add.Data, data[offset+6:offset+6+int(dataLength)]) return nil } -func (ap *ArtDiagData) MarshalBinary() ([]byte, error) { +func (add *ArtDiagData) MarshalBinary() ([]byte, error) { data := make([]byte, 8+10) - copy(data[0:8], ap.ID[:]) - binary.LittleEndian.PutUint16(data[8:10], ap.OpCode) - data[10] = ap.ProtVerHi - data[11] = ap.ProtVerLo - data[12] = ap.filler1 - data[13] = uint8(ap.DiagPriority) - data[14] = ap.LogicalPort - data[15] = ap.filler3 - binary.LittleEndian.PutUint16(data[16:18], ap.Length) - data = append(data, ap.Data...) + copy(data[0:8], add.ID[:]) + binary.LittleEndian.PutUint16(data[8:10], add.OpCode) + data[10] = add.ProtVerHi + data[11] = add.ProtVerLo + data[12] = add.filler1 + data[13] = uint8(add.DiagPriority) + data[14] = add.LogicalPort + data[15] = add.filler3 + dataLength := uint16(len(add.Data)) + if dataLength > 512 { + return nil, errors.New("data length must be less than or equal to 512 bytes") + } + binary.LittleEndian.PutUint16(data[16:18], dataLength) + data = append(data, add.Data...) return data, nil }