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.enocean.internal.messages;
15 import java.security.InvalidParameterException;
16 import java.util.Arrays;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
22 * @author Daniel Weber - Initial contribution
25 public abstract class BasePacket {
27 public enum ESPPacketType {
28 RADIO_ERP1((byte) 0x01),
29 RESPONSE((byte) 0x02),
30 RADIO_SUB_TEL((byte) 0x03),
32 COMMON_COMMAND((byte) 0x05),
33 SMART_ACK_COMMAND((byte) 0x06),
34 REMOTE_MAN_COMMAND((byte) 0x07),
35 RADIO_MESSAGE((byte) 0x09),
36 RADIO_ERP2((byte) 0x0A);
40 private ESPPacketType(byte value) {
44 public byte getValue() {
48 public static boolean hasValue(byte value) {
49 for (ESPPacketType p : ESPPacketType.values()) {
50 if (p.value == value) {
58 public static ESPPacketType getPacketType(byte packetType) {
59 for (ESPPacketType p : ESPPacketType.values()) {
60 if (p.value == packetType) {
65 throw new InvalidParameterException("Unknown packetType value");
69 protected ESPPacketType packetType;
70 protected byte[] data;
71 protected byte[] optionalData = new byte[0];
73 public BasePacket(int dataLength, int optionalDataLength, ESPPacketType packetType, byte[] payload) {
74 this(dataLength, optionalDataLength, packetType.value, payload);
77 public BasePacket(int dataLength, int optionalDataLength, byte packetType, byte[] payload) {
78 if (!ESPPacketType.hasValue(packetType)) {
79 throw new InvalidParameterException("Packet type is unknown");
82 if (dataLength + optionalDataLength > payload.length) {
83 throw new InvalidParameterException("data length does not match provided lengths");
86 this.packetType = ESPPacketType.getPacketType(packetType);
88 this.data = new byte[dataLength];
89 System.arraycopy(payload, 0, this.data, 0, dataLength);
91 if (optionalDataLength > 0) {
92 this.optionalData = new byte[optionalDataLength];
93 System.arraycopy(payload, dataLength, optionalData, 0, optionalDataLength);
95 this.optionalData = new byte[0];
99 public ESPPacketType getPacketType() {
100 return this.packetType;
103 public byte[] getPayload(int offset, int length) {
104 return Arrays.copyOfRange(data, offset, offset + length);
107 public byte[] getPayload() {
111 public byte[] getOptionalPayload(int offset, int length) {
112 byte[] result = new byte[length];
113 System.arraycopy(optionalData, offset, result, 0, length);
117 public byte[] getOptionalPayload() {