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