]> git.basschouten.com Git - openhab-addons.git/blob
c2cd5a432e02ea871b863cd279b2954b8cef9bbd
[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.sinope.internal.core.appdata;
14
15 import java.nio.ByteBuffer;
16
17 import org.openhab.binding.sinope.internal.util.ByteUtil;
18
19 /**
20  * The Class SinopeAppData.
21  *
22  * @author Pascal Larin - Initial contribution
23  */
24 public class SinopeAppData {
25
26     /** The Constant DATA_ID_SIZE. */
27     protected static final int DATA_ID_SIZE = 4;
28
29     /** The Constant DATA_SIZE. */
30     protected static final int DATA_SIZE = 1;
31
32     /** The internal data. */
33     protected byte[] internal_data; // Full App object
34
35     /** The data id. */
36     private byte[] dataId;
37
38     /**
39      * The data.
40      * data == null ? Do not send data size and payload
41      */
42     private byte[] data; // Data field of the app object
43
44     /**
45      * Instantiates a new sinope app data.
46      *
47      * @param dataId the data id
48      * @param data the data
49      */
50     public SinopeAppData(byte[] dataId, byte[] data) {
51         this.dataId = dataId;
52         this.data = data;
53     }
54
55     /**
56      * Read.
57      *
58      * @param d the d
59      */
60     public void read(byte[] d) {
61         this.internal_data = d;
62         if (d.length >= DATA_ID_SIZE) {
63             ByteBuffer bb = ByteBuffer.wrap(d);
64             this.dataId = new byte[DATA_ID_SIZE];
65
66             bb.get(dataId);
67             this.dataId = ByteUtil.reverse(dataId);
68             if (d.length > DATA_ID_SIZE) {
69                 int len = bb.get() & 0xff;
70
71                 this.data = new byte[len];
72                 bb.get(this.data);
73             }
74         }
75     }
76
77     /**
78      * Gets the internal data.
79      *
80      * @return the internal data
81      */
82     public byte[] getInternalData() {
83         if (internal_data == null) {
84             int len = data != null ? 1 + data.length : 0;
85             byte[] b = new byte[DATA_ID_SIZE + len];
86
87             ByteBuffer bb = ByteBuffer.wrap(b);
88             bb.put(ByteUtil.reverse(dataId));
89             if (data != null) { // Special case, Data null, don't put app size
90                 bb.put((byte) data.length);
91                 bb.put(data);
92             }
93             this.internal_data = bb.array();
94         }
95
96         return this.internal_data;
97     }
98
99     /**
100      * Gets the data.
101      *
102      * @return the data
103      */
104     public byte[] getData() {
105         return this.data;
106     }
107
108     /**
109      * @see java.lang.Object#toString()
110      */
111     /*
112      *
113      *
114      * @see java.lang.Object#toString()
115      */
116     @Override
117     public String toString() {
118         StringBuilder sb = new StringBuilder();
119
120         sb.append(String.format("\n\tData ID: %s", ByteUtil.toString(this.dataId)));
121         if (data != null) {
122             sb.append(String.format("\n\t\tData Size: 0x%02X ", getData().length));
123             sb.append(String.format("\n\t\tData: %s", ByteUtil.toString(getData())));
124         }
125         return sb.toString();
126     }
127
128     /**
129      * Clean data.
130      * It nullifies the data field. Tells to not send data size and payload.
131      */
132     public void cleanData() {
133         this.data = null;
134     }
135 }