2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.dmx.internal.dmxoverethernet;
15 import org.openhab.binding.dmx.internal.multiverse.Universe;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
20 * The {@link ArtnetPacket} is an ArtNet packet template
22 * @author Jan N. Klug - Initial contribution
24 public class ArtnetPacket extends DmxOverEthernetPacket {
25 public static final int ARTNET_MAX_PACKET_LEN = 530;
26 public static final int ARTNET_MAX_PAYLOAD_SIZE = 512;
28 private final Logger logger = LoggerFactory.getLogger(ArtnetPacket.class);
31 * default constructor, creates a packet
35 public ArtnetPacket() {
36 payloadSize = ARTNET_MAX_PAYLOAD_SIZE;
37 rawPacket = new byte[ARTNET_MAX_PACKET_LEN];
39 /* init Artnet header, total length 38 bytes */
40 rawPacket[0] = 0x41; // packet identifier, 8 bytes
48 rawPacket[8] = 0x00; // OpCode, 2 bytes
50 rawPacket[10] = 0x00; // protocol version, 2 bytes
52 rawPacket[12] = 0x00; // sequence number, 1 byte
53 rawPacket[13] = 0x00; // physical input
54 rawPacket[14] = 0x00; // universe, 15 bit
56 rawPacket[16] = 0x00; // payload size, 2 bytes
61 public void setPayloadSize(int payloadSize) {
62 if (payloadSize < Universe.MIN_UNIVERSE_SIZE) {
63 payloadSize = Universe.MIN_UNIVERSE_SIZE;
64 logger.error("payload minimum is {} slots", Universe.MIN_UNIVERSE_SIZE);
65 } else if (payloadSize > Universe.MAX_UNIVERSE_SIZE) {
66 payloadSize = Universe.MAX_UNIVERSE_SIZE;
67 logger.warn("coercing payload size to allowed maximum of {} slots", Universe.MAX_UNIVERSE_SIZE);
70 rawPacket[16] = (byte) (payloadSize / 256);
71 rawPacket[17] = (byte) (payloadSize % 256);
73 this.payloadSize = payloadSize;
77 public void setUniverse(int universeId) {
78 /* observe limits from standard (coerce to range) */
79 this.universeId = universeId;
81 /* set universe in packet to universe-1 */
82 rawPacket[14] = (byte) (this.universeId % 256);
83 rawPacket[15] = (byte) (this.universeId / 256);
85 logger.trace("set packet universe to {}", this.universeId);
89 public void setSequence(int sequenceNo) {
90 rawPacket[12] = (byte) (sequenceNo % 256);
94 public void setPayload(byte[] payload) {
95 System.arraycopy(payload, 0, rawPacket, 18, payloadSize);
99 public void setPayload(byte[] payload, int payloadSize) {
100 if (payloadSize != this.payloadSize) {
101 setPayloadSize(payloadSize);
107 public int getPacketLength() {
108 return (18 + this.payloadSize);