]> git.basschouten.com Git - openhab-addons.git/blob
70b53968e261d4380469250d0530cfe645e85e29
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.dmx.internal.dmxoverethernet;
14
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;
19
20 /**
21  * The {@link ArtnetPacket} is an ArtNet packet template
22  *
23  * @author Jan N. Klug - Initial contribution
24  */
25 @NonNullByDefault
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;
29
30     private final Logger logger = LoggerFactory.getLogger(ArtnetPacket.class);
31
32     /**
33      * default constructor, creates a packet
34      *
35      */
36
37     public ArtnetPacket() {
38         payloadSize = ARTNET_MAX_PAYLOAD_SIZE;
39         rawPacket = new byte[ARTNET_MAX_PACKET_LEN];
40
41         /* init Artnet header, total length 38 bytes */
42         rawPacket[0] = 0x41; // packet identifier, 8 bytes
43         rawPacket[1] = 0x72;
44         rawPacket[2] = 0x74;
45         rawPacket[3] = 0x2d;
46         rawPacket[4] = 0x4e;
47         rawPacket[5] = 0x65;
48         rawPacket[6] = 0x74;
49         rawPacket[7] = 0x00;
50         rawPacket[8] = 0x00; // OpCode, 2 bytes
51         rawPacket[9] = 0x50;
52         rawPacket[10] = 0x00; // protocol version, 2 bytes
53         rawPacket[11] = 0x0e;
54         rawPacket[12] = 0x00; // sequence number, 1 byte
55         rawPacket[13] = 0x00; // physical input
56         rawPacket[14] = 0x00; // universe, 15 bit
57         rawPacket[15] = 0x00;
58         rawPacket[16] = 0x00; // payload size, 2 bytes
59         rawPacket[17] = 0x01;
60     }
61
62     @Override
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);
70         }
71
72         rawPacket[16] = (byte) (payloadSize / 256);
73         rawPacket[17] = (byte) (payloadSize % 256);
74
75         this.payloadSize = payloadSize;
76     }
77
78     @Override
79     public void setUniverse(int universeId) {
80         /* observe limits from standard (coerce to range) */
81         this.universeId = universeId;
82
83         /* set universe in packet to universe-1 */
84         rawPacket[14] = (byte) (this.universeId % 256);
85         rawPacket[15] = (byte) (this.universeId / 256);
86
87         logger.trace("set packet universe to {}", this.universeId);
88     }
89
90     @Override
91     public void setSequence(int sequenceNo) {
92         rawPacket[12] = (byte) (sequenceNo % 256);
93     }
94
95     @Override
96     public void setPayload(byte[] payload) {
97         System.arraycopy(payload, 0, rawPacket, 18, payloadSize);
98     }
99
100     @Override
101     public void setPayload(byte[] payload, int payloadSize) {
102         if (payloadSize != this.payloadSize) {
103             setPayloadSize(payloadSize);
104         }
105         setPayload(payload);
106     }
107
108     @Override
109     public int getPacketLength() {
110         return (18 + this.payloadSize);
111     }
112 }