1 package net.sf.mbus4j.devices;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 import net.sf.mbus4j.dataframes.Frame;
32 import net.sf.mbus4j.dataframes.MBusMedium;
33 import net.sf.mbus4j.dataframes.MBusResponseFramesContainer;
34 import net.sf.mbus4j.dataframes.ResponseFrameContainer;
35 import net.sf.mbus4j.dataframes.UserDataResponse;
36 import net.sf.mbus4j.dataframes.UserDataResponse.StatusCode;
37
38 import java.util.ArrayList;
39 import java.util.Iterator;
40 import java.util.List;
41 import net.sf.json.JSONArray;
42 import net.sf.json.JSONObject;
43 import net.sf.mbus4j.json.JSONFactory;
44 import net.sf.mbus4j.json.JSONSerializable;
45 import net.sf.mbus4j.json.JsonSerializeType;
46
47
48
49
50
51
52 public class GenericDevice
53 implements MBusResponseFramesContainer,
54 JSONSerializable {
55
56 private byte address;
57 private List<ResponseFrameContainer> responseFrameContainers = new ArrayList<ResponseFrameContainer>();
58 private int identNumber;
59 private byte version;
60 private boolean acd;
61 private boolean dfc;
62 private StatusCode[] status;
63 private short accessnumber;
64 private short signature;
65 private String manufacturer;
66 private MBusMedium medium;
67
68 @Override
69 public void setAddress(byte address) {
70 this.address = address;
71 }
72
73 @Override
74 public void setIdentNumber(int identNumber) {
75 this.identNumber = identNumber;
76 }
77
78 @Override
79 public void setVersion(byte version) {
80 this.version = version;
81 }
82
83 @Override
84 public boolean isAcd() {
85 return acd;
86 }
87
88 @Override
89 public void setAcd(boolean acd) {
90 this.acd = acd;
91 }
92
93 @Override
94 public boolean isDfc() {
95 return dfc;
96 }
97
98 @Override
99 public void setDfc(boolean dfc) {
100 this.dfc = dfc;
101 }
102
103 @Override
104 public void setManufacturer(String manufacturer) {
105 this.manufacturer = manufacturer;
106 }
107
108 @Override
109 public void setMedium(MBusMedium medium) {
110 this.medium = medium;
111 }
112
113 @Override
114 public byte getAddress() {
115 return address;
116 }
117
118 @Override
119 public int getIdentNumber() {
120 return identNumber;
121 }
122
123 @Override
124 public byte getVersion() {
125 return version;
126 }
127
128 @Override
129 public Iterator<ResponseFrameContainer> iterator() {
130 return responseFrameContainers.iterator();
131 }
132
133 @Override
134 public StatusCode[] getStatus() {
135 return status;
136 }
137
138 @Override
139 public void setStatus(StatusCode[] status) {
140 this.status = status;
141 }
142
143 @Override
144 public short getSignature() {
145 return signature;
146 }
147
148 @Override
149 public void setSignature(short signature) {
150 this.signature = signature;
151 }
152
153 @Override
154 public short getAccessnumber() {
155 return accessnumber;
156 }
157
158 @Override
159 public void setAccessnumber(short accessnumber) {
160 this.accessnumber = accessnumber;
161 }
162
163 @Override
164 public ResponseFrameContainer getResponseFrameContainer(int index) {
165 return responseFrameContainers.get(index);
166 }
167
168 @Override
169 public ResponseFrameContainer[] getResponseFrameContainers() {
170 return responseFrameContainers.toArray(new ResponseFrameContainer[responseFrameContainers.size()]);
171 }
172
173 @Override
174 public int getResponseFrameContainerCount() {
175 return responseFrameContainers.size();
176 }
177
178 public GenericDevice() {
179 }
180
181 public GenericDevice(byte address, String manufacturer, MBusMedium medium, byte version, int identNumber) {
182 super();
183 this.manufacturer = manufacturer;
184 this.medium = medium;
185 this.address = address;
186 this.version = version;
187 this.identNumber = identNumber;
188 }
189
190 public GenericDevice(UserDataResponse udResp, Frame requestFrame) {
191 this(udResp.getAddress(),
192 udResp.getManufacturer(),
193 udResp.getMedium(),
194 udResp.getVersion(),
195 udResp.getIdentNumber());
196 setAccessnumber(udResp.getAccessNumber());
197 setAcd(udResp.isAcd());
198 setDfc(udResp.isDfc());
199 setStatus(udResp.getStatus());
200 setSignature(udResp.getSignature());
201 ResponseFrameContainer rfc = new ResponseFrameContainer();
202 rfc.setResponseFrame(udResp);
203 rfc.setRequestFrame(requestFrame);
204 responseFrameContainers.add(rfc);
205 }
206
207 @Override
208 public String getManufacturer() {
209 return manufacturer;
210 }
211
212 @Override
213 public MBusMedium getMedium() {
214 return medium;
215 }
216
217 @Override
218 public void fromJSON(JSONObject json) {
219 setManufacturer(json.getString("manufacturer"));
220 setMedium(MBusMedium.fromLabel(json.getString("medium")));
221 setVersion(JSONFactory.decodeHexByte(json, "version", (byte) 0));
222 setIdentNumber(json.getInt("identNumber"));
223 setAddress(JSONFactory.decodeHexByte(json, "address", (byte) 0));
224 setAccessnumber(JSONFactory.getShort(json, "accessNumber", (short) 0));
225 setAcd(JSONFactory.getBoolean(json, "acd", false));
226 setDfc(JSONFactory.getBoolean(json, "dfc", false));
227 setSignature(JSONFactory.decodeHexShort(json, "signature", (short) 0));
228
229 if (json.containsKey("status")) {
230 JSONArray statusArray = json.getJSONArray("status");
231
232 if (statusArray.size() == 0) {
233 setStatus(new UserDataResponse.StatusCode[0]);
234 } else {
235 UserDataResponse.StatusCode[] status = new UserDataResponse.StatusCode[statusArray.size()];
236
237 for (int i = 0; i < status.length; i++) {
238 status[i] = UserDataResponse.StatusCode.fromLabel(statusArray.getString(i));
239 }
240
241 setStatus(status);
242 }
243 }
244
245 JSONArray jsonSlaveFrameContainers = json.getJSONArray("slaveFrameContainers");
246
247 for (int i = 0; i < jsonSlaveFrameContainers.size(); i++) {
248 ResponseFrameContainer sfc = new ResponseFrameContainer();
249 sfc.fromJSON(jsonSlaveFrameContainers.getJSONObject(i));
250 responseFrameContainers.add(sfc);
251 }
252 }
253
254 @Override
255 public JSONObject toJSON(JsonSerializeType jsonSerializeType) {
256 JSONObject result = new JSONObject();
257 result.accumulate("manufacturer",
258 getManufacturer());
259 result.accumulate("medium",
260 getMedium().getLabel());
261 result.accumulate("version",
262 JSONFactory.encodeHexByte(getVersion()));
263 result.accumulate("address",
264 JSONFactory.encodeHexByte(getAddress()));
265 result.accumulate("signature",
266 JSONFactory.encodeHexShort(getSignature()));
267
268 JSONArray jsonStatusArray = new JSONArray();
269
270 if (getStatus() != null) {
271 for (UserDataResponse.StatusCode st : getStatus()) {
272 jsonStatusArray.add(st.getLabel());
273 }
274 }
275
276 result.accumulate("accessnumber",
277 getAccessnumber());
278 result.accumulate("status", jsonStatusArray);
279 result.accumulate("identNumber",
280 getIdentNumber());
281 result.accumulate("acd",
282 isAcd());
283 result.accumulate("dfc",
284 isDfc());
285
286 JSONArray jsonSlaveFrameContainer = new JSONArray();
287
288 for (ResponseFrameContainer sfc : responseFrameContainers) {
289 jsonSlaveFrameContainer.add(sfc.toJSON(jsonSerializeType));
290 }
291
292 result.accumulate("slaveFrameContainers", jsonSlaveFrameContainer);
293
294 return result;
295 }
296
297 public boolean addResponseFrameContainer(ResponseFrameContainer container) {
298 if ((container.getName() == null) || (container.getName().equals(ResponseFrameContainer.DEFAULT_NAME))) {
299 container.setName("frame " + responseFrameContainers.size());
300 }
301 return responseFrameContainers.add(container);
302 }
303
304 ;
305
306 @Override
307 public ResponseFrameContainer removeResponseFrameContainer(int i) {
308 return responseFrameContainers.remove(i);
309 }
310
311 @Override
312 public int responseFrameContainerIndexOf(ResponseFrameContainer rfc) {
313 return responseFrameContainers.indexOf(rfc);
314 }
315 }