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.eclipse.jdt.annotation.NonNullByDefault;
16 import org.openhab.binding.dmx.internal.multiverse.Universe;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
21 * The {@link ArtnetPacket} is an ArtNet packet template
23 * @author Jan N. Klug - Initial contribution
26 public class ArtnetPacket extends DmxOverEthernetPacket {
27 public static final int ARTNET_MAX_PACKET_LEN = 530;
28 public static final int ARTNET_MAX_PAYLOAD_SIZE = 512;
30 private final Logger logger = LoggerFactory.getLogger(ArtnetPacket.class);
33 * default constructor, creates a packet
37 public ArtnetPacket() {
38 payloadSize = ARTNET_MAX_PAYLOAD_SIZE;
39 rawPacket = new byte[ARTNET_MAX_PACKET_LEN];
41 /* init Artnet header, total length 38 bytes */
42 rawPacket[0] = 0x41; // packet identifier, 8 bytes
50 rawPacket[8] = 0x00; // OpCode, 2 bytes
52 rawPacket[10] = 0x00; // protocol version, 2 bytes
54 rawPacket[12] = 0x00; // sequence number, 1 byte
55 rawPacket[13] = 0x00; // physical input
56 rawPacket[14] = 0x00; // universe, 15 bit
58 rawPacket[16] = 0x00; // payload size, 2 bytes
63 public void setPayloadSize(int payloadSize) {
64 if (payloadSize < Universe.MIN_UNIVERSE_SIZE) {
65 payloadSize = Universe.MIN_UNIVERSE_SIZE;
66 logger.error("payload minimum is {} slots", Universe.MIN_UNIVERSE_SIZE);
67 } else if (payloadSize > Universe.MAX_UNIVERSE_SIZE) {
68 payloadSize = Universe.MAX_UNIVERSE_SIZE;
69 logger.warn("coercing payload size to allowed maximum of {} slots", Universe.MAX_UNIVERSE_SIZE);
72 rawPacket[16] = (byte) (payloadSize / 256);
73 rawPacket[17] = (byte) (payloadSize % 256);
75 this.payloadSize = payloadSize;
79 public void setUniverse(int universeId) {
80 /* observe limits from standard (coerce to range) */
81 this.universeId = universeId;
83 /* set universe in packet to universe-1 */
84 rawPacket[14] = (byte) (this.universeId % 256);
85 rawPacket[15] = (byte) (this.universeId / 256);
87 logger.trace("set packet universe to {}", this.universeId);
91 public void setSequence(int sequenceNo) {
92 rawPacket[12] = (byte) (sequenceNo % 256);
96 public void setPayload(byte[] payload) {
97 System.arraycopy(payload, 0, rawPacket, 18, payloadSize);
101 public void setPayload(byte[] payload, int payloadSize) {
102 if (payloadSize != this.payloadSize) {
103 setPayloadSize(payloadSize);
109 public int getPacketLength() {
110 return (18 + this.payloadSize);