]> git.basschouten.com Git - openhab-addons.git/blob
9c3b577cdb816cd6f7b5f241051995e7213ab963
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.rfxcom.internal.messages;
14
15 import static org.openhab.binding.rfxcom.internal.RFXComBindingConstants.*;
16 import static org.openhab.binding.rfxcom.internal.messages.RFXComBaseMessage.PacketType.UNDECODED_RF_MESSAGE;
17
18 import java.util.Arrays;
19
20 import org.openhab.binding.rfxcom.internal.exceptions.RFXComException;
21 import org.openhab.binding.rfxcom.internal.exceptions.RFXComMessageTooLongException;
22 import org.openhab.binding.rfxcom.internal.exceptions.RFXComUnsupportedChannelException;
23 import org.openhab.binding.rfxcom.internal.exceptions.RFXComUnsupportedValueException;
24 import org.openhab.binding.rfxcom.internal.handler.DeviceState;
25 import org.openhab.core.library.types.StringType;
26 import org.openhab.core.types.State;
27 import org.openhab.core.types.Type;
28 import org.openhab.core.util.HexUtils;
29
30 /**
31  * RFXCOM data class for undecoded messages.
32  *
33  * @author Ivan Martinez - Initial contribution
34  * @author James Hewitt-Thomas - Migrated for OH2
35  */
36 public class RFXComUndecodedRFMessage extends RFXComDeviceMessageImpl<RFXComUndecodedRFMessage.SubType> {
37
38     public enum SubType implements ByteEnumWrapper {
39         AC(0x00),
40         ARC(0x01),
41         ATI(0x02),
42         HIDEKI_UPM(0x03),
43         LACROSSE_VIKING(0x04),
44         AD(0x05),
45         MERTIK(0x06),
46         OREGON1(0x07),
47         OREGON2(0x08),
48         OREGON3(0x09),
49         PROGUARD(0x0A),
50         VISONIC(0x0B),
51         NEC(0x0C),
52         FS20(0x0D),
53         RESERVED(0x0E),
54         BLINDS(0x0F),
55         RUBICSON(0x10),
56         AE(0x11),
57         FINE_OFFSET(0x12),
58         RGB(0x13),
59         RTS(0x14),
60         SELECT_PLUS(0x15),
61         HOME_CONFORT(0x16),
62
63         UNKNOWN(0xFF);
64
65         private final int subType;
66
67         SubType(int subType) {
68             this.subType = subType;
69         }
70
71         @Override
72         public byte toByte() {
73             return (byte) subType;
74         }
75
76         public static SubType fromByte(int input) {
77             for (SubType c : SubType.values()) {
78                 if (c.subType == input) {
79                     return c;
80                 }
81             }
82
83             return SubType.UNKNOWN;
84         }
85     }
86
87     public SubType subType;
88     public byte[] rawPayload = new byte[0];
89
90     public RFXComUndecodedRFMessage() {
91         super(UNDECODED_RF_MESSAGE);
92     }
93
94     public RFXComUndecodedRFMessage(byte[] message) throws RFXComException {
95         encodeMessage(message);
96     }
97
98     @Override
99     public String toString() {
100         String str = super.toString();
101
102         str += ", Sub type = " + subType;
103
104         return str;
105     }
106
107     @Override
108     public void encodeMessage(byte[] message) throws RFXComException {
109         super.encodeMessage(message);
110
111         subType = SubType.fromByte(super.subType);
112         rawPayload = Arrays.copyOfRange(rawMessage, 4, rawMessage.length);
113     }
114
115     @Override
116     public byte[] decodeMessage() throws RFXComException {
117         if (rawPayload.length > 33) {
118             throw new RFXComMessageTooLongException("Longest payload according to RFXCOM spec is 33 bytes.");
119         }
120
121         final int rawPayloadLen = rawPayload.length;
122         byte[] data = new byte[4 + rawPayloadLen];
123
124         data[0] = (byte) (data.length - 1);
125         data[1] = UNDECODED_RF_MESSAGE.toByte();
126         data[2] = subType.toByte();
127         data[3] = seqNbr;
128
129         System.arraycopy(rawPayload, 0, data, 4, rawPayloadLen);
130         return data;
131     }
132
133     @Override
134     public String getDeviceId() {
135         return "UNDECODED";
136     }
137
138     @Override
139     public State convertToState(String channelId, DeviceState deviceState) throws RFXComUnsupportedChannelException {
140         switch (channelId) {
141             case CHANNEL_RAW_MESSAGE:
142                 return new StringType(HexUtils.bytesToHex(rawMessage));
143
144             case CHANNEL_RAW_PAYLOAD:
145                 return new StringType(HexUtils.bytesToHex(rawPayload));
146
147             default:
148                 throw new RFXComUnsupportedChannelException("Nothing relevant for " + channelId);
149         }
150     }
151
152     @Override
153     public void setSubType(SubType subType) {
154         throw new UnsupportedOperationException();
155     }
156
157     @Override
158     public void setDeviceId(String deviceId) {
159         throw new UnsupportedOperationException();
160     }
161
162     @Override
163     public void convertFromState(String channelId, Type type) {
164         throw new UnsupportedOperationException();
165     }
166
167     @Override
168     public SubType convertSubType(String subType) throws RFXComUnsupportedValueException {
169         return ByteEnumUtil.convertSubType(SubType.class, subType);
170     }
171 }