View Javadoc
1   package net.sf.mbus4j.devices;
2   
3   /*
4    * #%L
5    * mbus4j-master
6    * %%
7    * Copyright (C) 2009 - 2014 MBus4J
8    * %%
9    * mbus4j - Drivers for the M-Bus protocol - http://mbus4j.sourceforge.net/
10   * Copyright (C) 2009-2014, mbus4j.sf.net, and individual contributors as indicated
11   * by the @authors tag. See the copyright.txt in the distribution for a
12   * full listing of individual contributors.
13   * 
14   * This is free software; you can redistribute it and/or modify it
15   * under the terms of the GNU General Public License as
16   * published by the Free Software Foundation; either version 3 of
17   * the License, or (at your option) any later version.
18   * 
19   * This software is distributed in the hope that it will be useful,
20   * but WITHOUT ANY WARRANTY; without even the implied warranty of
21   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22   * Lesser General Public License for more details.
23   * 
24   * You should have received a copy of the GNU Lesser General Public
25   * License along with this software; if not, write to the Free
26   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
28   * #L%
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   * @author arnep@users.sourceforge.net
50   * @version $Id: GenericDevice.java 104 2014-02-21 09:31:17Z arnep $
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 }