View Javadoc
1   package net.sf.mbus4j.dataframes.datablocks.vif;
2   
3   /*
4    * #%L
5    * mbus4j-core
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  import static net.sf.mbus4j.dataframes.datablocks.vif.SiPrefix.KILO;
31  import static net.sf.mbus4j.dataframes.datablocks.vif.SiPrefix.MEGA;
32  import static net.sf.mbus4j.dataframes.datablocks.vif.SiPrefix.MICRO;
33  import static net.sf.mbus4j.dataframes.datablocks.vif.SiPrefix.MILLI;
34  import static net.sf.mbus4j.dataframes.datablocks.vif.SiPrefix.ONE;
35  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.BAR;
36  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.CUBIC_METER;
37  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.CUBIC_METER_PER_HOUR;
38  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.CUBIC_METER_PER_MINUTE;
39  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.DATE;
40  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.DAY;
41  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.DEGREE_CELSIUS;
42  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.GRAMM;
43  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.GRAMM_PER_HOUR;
44  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.HOUR;
45  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.JOULE;
46  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.JOULE_PER_HOUR;
47  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.KELVIN;
48  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.LITRE;
49  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.LITRE_PER_HOUR;
50  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.LITRE_PER_MINUTE;
51  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.LITRE_PER_SECOND;
52  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.MINUTE;
53  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.SECOND;
54  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.TIME_AND_DATE;
55  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.TONNS;
56  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.TONN_PER_HOUR;
57  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.WATT;
58  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.WATT_HOUR;
59  
60  
61  /**
62   *
63   * @author arnep@users.sourceforge.net
64   * @version $Id: VifPrimary.java 163 2016-10-07 18:53:55Z arnep $
65   */
66  public enum VifPrimary implements Vif {
67  
68      ENERGY_MILLI_WH_E_0(0x00, ENERGY, MILLI, WATT_HOUR, 0),
69      ENERGY_MILLI_WH_E_1(0x01, ENERGY, MILLI, WATT_HOUR, 1),
70      ENERGY_MILLI_WH_E_2(0x02, ENERGY, MILLI, WATT_HOUR, 2),
71      ENERGY_WH_E_0(0x03, ENERGY, ONE, WATT_HOUR, 0),
72      ENERGY_WH_E_1(0x04, ENERGY, ONE, WATT_HOUR, 1),
73      ENERGY_WH_E_2(0x05, ENERGY, ONE, WATT_HOUR, 2),
74      ENERGY_KILO_WH_E_0(0x06, ENERGY, KILO, WATT_HOUR, 0),
75      ENERGY_KILO_WH_E_1(0x07, ENERGY, KILO, WATT_HOUR, 1),
76      ENERGY_J_E_0(0x08, ENERGY, ONE, JOULE, 0),
77      ENERGY_J_E_1(0x09, ENERGY, ONE, JOULE, 1),
78      ENERGY_J_E_2(0x0A, ENERGY, ONE, JOULE, 2),
79      ENERGY_KILO_J_E_0(0x0B, ENERGY, KILO, JOULE, 0),
80      ENERGY_KILO_J_E_1(0x0C, ENERGY, KILO, JOULE, 1),
81      ENERGY_KILO_J_E_2(0x0D, ENERGY, KILO, JOULE, 2),
82      ENERGY_MEGA_J_E_0(0x0E, ENERGY, MEGA, JOULE, 0),
83      ENERGY_MEGA_J_E_1(0x0F, ENERGY, MEGA, JOULE, 1),
84      VOLUME_MILLI_L_E_0(0x10, VOLUME, MILLI, LITRE, 0),
85      VOLUME_MILLI_L_E_1(0x11, VOLUME, MILLI, LITRE, 1),
86      VOLUME_MILLI_L_E_2(0x12, VOLUME, MILLI, LITRE, 2),
87      VOLUME_L_E_0(0x13, VOLUME, ONE, LITRE, 0),
88      VOLUME_L_E_1(0x14, VOLUME, ONE, LITRE, 1),
89      VOLUME_L_E_2(0x15, VOLUME, ONE, LITRE, 2),
90      VOLUME_CBM_E_0(0x16, VOLUME, ONE, CUBIC_METER, 0),
91      VOLUME_CBM_E_1(0x17, VOLUME, ONE, CUBIC_METER, 1),
92      MASS_G_E_0(0x18, MASS, ONE, GRAMM, 0),
93      MASS_G_E_1(0x19, MASS, ONE, GRAMM, 1),
94      MASS_G_E_2(0x1A, MASS, ONE, GRAMM, 2),
95      MASS_KILO_G_E_0(0x1B, MASS, KILO, GRAMM, 0),
96      MASS_KILO_G_E_1(0x1C, MASS, KILO, GRAMM, 1),
97      MASS_KILO_G_E_2(0x1D, MASS, KILO, GRAMM, 2),
98      MASS_TONNS_E_0(0x1E, MASS, ONE, TONNS, 0),
99      MASS_TONNS_E_1(0x1F, MASS, ONE, TONNS, 1),
100     ON_TIME_S(0x20, ON_TIME, SECOND),
101     ON_TIME_MIN(0x21, ON_TIME, MINUTE),
102     ON_TIME_H(0x22, ON_TIME, HOUR),
103     ON_TIME_D(0x23, ON_TIME, DAY),
104     OPERATING_TIME_S(0x24, OPERATING_TIME, SECOND),
105     OPERATING_TIME_MIN(0x25, OPERATING_TIME, MINUTE),
106     OPERATING_TIME_H(0x26, OPERATING_TIME, HOUR),
107     OPERATING_TIME_D(0x27, OPERATING_TIME, DAY),
108     POWER_MILLI_W_E_0(0x28, POWER, MILLI, WATT, 0),
109     POWER_MILLI_W_E_1(0x29, POWER, MILLI, WATT, 1),
110     POWER_MILLI_W_E_2(0x2A, POWER, MILLI, WATT, 2),
111     POWER_W_E_0(0x2B, POWER, ONE, WATT, 0),
112     POWER_W_E_1(0x2C, POWER, ONE, WATT, 1),
113     POWER_W_E_2(0x2D, POWER, ONE, WATT, 2),
114     POWER_KILO_W_E_0(0x2E, POWER, KILO, WATT, 0),
115     POWER_KILO_W_E_1(0x2F, POWER, KILO, WATT, 1),
116     POWER_J_PER_H_E_0(0x30, POWER, ONE, JOULE_PER_HOUR, 0),
117     POWER_J_PER_H_E_1(0x31, POWER, ONE, JOULE_PER_HOUR, 1),
118     POWER_J_PER_H_E_2(0x32, POWER, ONE, JOULE_PER_HOUR, 2),
119     POWER_KILO_J_PER_H_E_0(0x33, POWER, KILO, JOULE_PER_HOUR, 0),
120     POWER_KILO_J_PER_H_E_1(0x34, POWER, KILO, JOULE_PER_HOUR, 1),
121     POWER_KILO_J_PER_H_E_2(0x35, POWER, KILO, JOULE_PER_HOUR, 2),
122     POWER_MEGA_J_PER_H_E_0(0x36, POWER, MEGA, JOULE_PER_HOUR, 0),
123     POWER_MEGA_J_PER_H_E_1(0x37, POWER, MEGA, JOULE_PER_HOUR, 1),
124     VOLUME_FLOW_MILLI_L_PER_H_E_0(0x38, VOLUME_FLOW, MILLI, LITRE_PER_HOUR, 0),
125     VOLUME_FLOW_MILLI_L_PER_H_E_1(0x39, VOLUME_FLOW, MILLI, LITRE_PER_HOUR, 1),
126     VOLUME_FLOW_MILLI_L_PER_H_E_2(0x3A, VOLUME_FLOW, MILLI, LITRE_PER_HOUR, 2),
127     VOLUME_FLOW_L_PER_H_E_0(0x3B, VOLUME_FLOW, ONE, LITRE_PER_HOUR, 0),
128     VOLUME_FLOW_L_PER_H_E_1(0x3C, VOLUME_FLOW, ONE, LITRE_PER_HOUR, 1),
129     VOLUME_FLOW_L_PER_H_E_2(0x3D, VOLUME_FLOW, ONE, LITRE_PER_HOUR, 2),
130     VOLUME_FLOW_CBM_PER_H_E_0(0x3E, VOLUME_FLOW, ONE, CUBIC_METER_PER_HOUR, 0),
131     VOLUME_FLOW_CBM_PER_H_E_1(0x3F, VOLUME_FLOW, ONE, CUBIC_METER_PER_HOUR, 1),
132     VOLUME_FLOW_MICRO_L_PER_MIN_E_2(0x40, VOLUME_FLOW, MICRO, LITRE_PER_MINUTE, 2),
133     VOLUME_FLOW_MILLI_L_PER_MIN_E_0(0x41, VOLUME_FLOW, MILLI, LITRE_PER_MINUTE, 0),
134     VOLUME_FLOW_MILLI_L_PER_MIN_E_1(0x42, VOLUME_FLOW, MILLI, LITRE_PER_MINUTE, 1),
135     VOLUME_FLOW_MILLI_L_PER_MIN_E_2(0x43, VOLUME_FLOW, MILLI, LITRE_PER_MINUTE, 2),
136     VOLUME_FLOW_L_PER_MIN_E_0(0x44, VOLUME_FLOW, ONE, LITRE_PER_MINUTE, 0),
137     VOLUME_FLOW_L_PER_MIN_E_1(0x45, VOLUME_FLOW, ONE, LITRE_PER_MINUTE, 1),
138     VOLUME_FLOW_L_PER_MIN_E_2(0x46, VOLUME_FLOW, ONE, LITRE_PER_MINUTE, 2),
139     VOLUME_FLOW_CBM_PER_MIN_E_0(0x47, VOLUME_FLOW, ONE, CUBIC_METER_PER_MINUTE, 0),
140     VOLUME_FLOW_MICRO_L_PER_S_E_0(0x48, VOLUME_FLOW, MICRO, LITRE_PER_SECOND, 0),
141     VOLUME_FLOW_MICRO_L_PER_S_E_1(0x49, VOLUME_FLOW, MICRO, LITRE_PER_SECOND, 1),
142     VOLUME_FLOW_MICRO_L_PER_S_E_2(0x4A, VOLUME_FLOW, MICRO, LITRE_PER_SECOND, 2),
143     VOLUME_FLOW_MILLI_L_PER_S_E_0(0x4B, VOLUME_FLOW, MILLI, LITRE_PER_SECOND, 0),
144     VOLUME_FLOW_MILLI_L_PER_S_E_1(0x4C, VOLUME_FLOW, MILLI, LITRE_PER_SECOND, 1),
145     VOLUME_FLOW_MILLI_L_PER_S_E_2(0x4D, VOLUME_FLOW, MILLI, LITRE_PER_SECOND, 2),
146     VOLUME_FLOW_L_PER_S_E_0(0x4E, VOLUME_FLOW, ONE, LITRE_PER_SECOND, 0),
147     VOLUME_FLOW_L_PER_S_E_1(0x4F, VOLUME_FLOW, ONE, LITRE_PER_SECOND, 1),
148     MASS_FLOW_GRAMM_PER_H_E_0(0x50, MASS_FLOW, ONE, GRAMM_PER_HOUR, 0),
149     MASS_FLOW_GRAMM_PER_H_E_1(0x51, MASS_FLOW, ONE, GRAMM_PER_HOUR, 1),
150     MASS_FLOW_GRAMM_PER_H_E_2(0x52, MASS_FLOW, ONE, GRAMM_PER_HOUR, 2),
151     MASS_FLOW_KG_PER_H_E_0(0x53, MASS_FLOW, KILO, GRAMM_PER_HOUR, 0),
152     MASS_FLOW_KG_PER_H_E_1(0x54, MASS_FLOW, KILO, GRAMM_PER_HOUR, 1),
153     MASS_FLOW_KG_PER_H_E_2(0x55, MASS_FLOW, KILO, GRAMM_PER_HOUR, 2),
154     MASS_FLOW_T_PER_H_E_0(0x56, MASS_FLOW, ONE, TONN_PER_HOUR, 0),
155     MASS_FLOW_T_PER_H_E_1(0x57, MASS_FLOW, ONE, TONN_PER_HOUR, 1),
156     FLOW_TEMPERATURE_C_E__3(0x58, FLOW_TEMPERATURE, ONE, DEGREE_CELSIUS, -3),
157     FLOW_TEMPERATURE_C_E__2(0x59, FLOW_TEMPERATURE, ONE, DEGREE_CELSIUS, -2),
158     FLOW_TEMPERATURE_C_E__1(0x5A, FLOW_TEMPERATURE, ONE, DEGREE_CELSIUS, -1),
159     FLOW_TEMPERATURE_C_E_0(0x5B, FLOW_TEMPERATURE, ONE, DEGREE_CELSIUS, 0),
160     RETURN_TEMPERATURE_C_E__3(0x5C, RETURN_TEMPERATURE, ONE, DEGREE_CELSIUS, -3),
161     RETURN_TEMPERATURE_C_E__2(0x5D, RETURN_TEMPERATURE, ONE, DEGREE_CELSIUS, -2),
162     RETURN_TEMPERATURE_C_E__1(0x5E, RETURN_TEMPERATURE, ONE, DEGREE_CELSIUS, -1),
163     RETURN_TEMPERATURE_C_E_0(0x5F, RETURN_TEMPERATURE, ONE, DEGREE_CELSIUS, 0),
164     TEMPERATURE_DIFFERENCE_K_E__3(0x60, TEMPERATURE_DIFFERENCE, ONE, KELVIN, -3),
165     TEMPERATURE_DIFFERENCE_K_E__2(0x61, TEMPERATURE_DIFFERENCE, ONE, KELVIN, -2),
166     TEMPERATURE_DIFFERENCE_K_E__1(0x62, TEMPERATURE_DIFFERENCE, ONE, KELVIN, -1),
167     TEMPERATURE_DIFFERENCE_K_E_0(0x63, TEMPERATURE_DIFFERENCE, ONE, KELVIN, 0),
168     EXTERNAL_TEMPERATURE_C_E__3(0x64, EXTERNAL_TEMPERATURE, ONE, DEGREE_CELSIUS, -3),
169     EXTERNAL_TEMPERATURE_C_E__2(0x65, EXTERNAL_TEMPERATURE, ONE, DEGREE_CELSIUS, -2),
170     EXTERNAL_TEMPERATURE_C_E__1(0x66, EXTERNAL_TEMPERATURE, ONE, DEGREE_CELSIUS, -1),
171     EXTERNAL_TEMPERATURE_C_E_0(0x67, EXTERNAL_TEMPERATURE, ONE, DEGREE_CELSIUS, 0),
172     PRESSURE_MILLI_BAR_E__3(0x68, PRESSURE, MILLI, BAR, 0),
173     PRESSURE_MILLI_BAR_E__2(0x69, PRESSURE, MILLI, BAR, 1),
174     PRESSURE_MILLI_BAR_E__1(0x6A, PRESSURE, MILLI, BAR, 2),
175     PRESSURE_BAR_E_0(0x6B, PRESSURE, ONE, BAR, 0),
176     TIMEPOINT_DATE(0x6C, TIME_POINT, DATE),
177     TIMEPOINT_TIME_AND_DATE(0x6D, TIME_POINT, TIME_AND_DATE),
178     UNITS_FOR_H_C_A(0x6E, "Units for H.C.A."),
179     RESERVED_0X6F(0x6F),
180     AVERAGING_DURATION_S(0x70, AVERAGING_DURATION, SECOND),
181     AVERAGING_DURATION_MIN(0x71, AVERAGING_DURATION, MINUTE),
182     AVERAGING_DURATION_H(0x72, AVERAGING_DURATION, HOUR),
183     AVERAGING_DURATION_D(0x73, AVERAGING_DURATION, DAY),
184     ACTUALLY_DURATION_S(0x74, ACTUALLY_DURATION, SECOND),
185     ACTUALLY_DURATION_MIN(0x75, ACTUALLY_DURATION, MINUTE),
186     ACTUALLY_DURATION_H(0x76, ACTUALLY_DURATION, HOUR),
187     ACTUALLY_DURATION_D(0x77, ACTUALLY_DURATION, DAY),
188     FABRICATION_NO(0x78, "Fabrication No"),
189     ENHANCED_IDENTIFICATION_RECORD(0x79, "Enhanced Identification Record"),
190     BUS_ADDRESS(0x7A, "Bus Address"),
191     EXTENSION_OF_VIF_CODES_FB(0x7B, "true VIF is given in the first VIFE FB extention"),
192     ASCII_EXTENTION(0x7C, "ASCII EXT"),
193     EXTENSION_OF_VIF_CODES_FD(0x7D, "true VIF is given in the first VIFE FD extention"),
194     READOUT_SELECTION(0x7E, "Readout selection of all storage numbers, all tariffs and all VIF");
195 
196     public final static VifPrimary valueOfTableIndex(int vifCode) {
197         return map[vifCode];
198     }
199     private final String label;
200     private final SiPrefix siPrefix;
201     private final UnitOfMeasurement unit;
202     private final Integer exponent;
203     private final static VifPrimary[] map = values();
204 
205     private VifPrimary(int vifCode) {
206         if (this.ordinal() != vifCode) {
207             throw new IllegalArgumentException("ordinal and vifCode mismatch!");
208         }
209         this.label = String.format("VifStd Reserved 0x%02x", vifCode);
210         this.siPrefix = null;
211         this.unit = null;
212         this.exponent = null;
213     }
214 
215     private VifPrimary(int vifCode, String label) {
216         if (this.ordinal() != vifCode) {
217             throw new IllegalArgumentException("ordinal and vifCode mismatch!");
218         }
219         this.label = label;
220         this.siPrefix = null;
221         this.unit = null;
222         this.exponent = null;
223     }
224 
225     private VifPrimary(int vifCode, String label, SiPrefix siPrefix, UnitOfMeasurement unit, int exponent) {
226         if (this.ordinal() != vifCode) {
227             throw new IllegalArgumentException("ordinal and vifCode mismatch!");
228         }
229         this.label = label;
230         this.siPrefix = siPrefix;
231         this.unit = unit;
232         this.exponent = exponent;
233     }
234 
235     private VifPrimary(int vifCode, String label, UnitOfMeasurement unit) {
236         if (this.ordinal() != vifCode) {
237             throw new IllegalArgumentException("ordinal and vifCode mismatch!");
238         }
239         this.label = label;
240         this.siPrefix = null;
241         this.unit = unit;
242         this.exponent = null;
243     }
244 
245     /**
246      * @return the exponent
247      */
248     @Override
249     final public Integer getExponent() {
250         return exponent;
251     }
252 
253     @Override
254     final public String getLabel() {
255         return label;
256     }
257 
258     /**
259      * @return the siPrefix
260      */
261     @Override
262     final public SiPrefix getSiPrefix() {
263         return siPrefix;
264     }
265 
266     final public byte getTableIndex() {
267         return (byte) ordinal();
268     }
269 
270     /**
271      * @return the unit
272      */
273     @Override
274     final public UnitOfMeasurement getUnitOfMeasurement() {
275         return unit;
276     }
277 
278     public int getVifCode() {
279         return ordinal();
280     }
281 
282     @Override
283     public String toString() {
284         return VifToString.vifToString(this);
285     }
286 
287     public static VifPrimary assemble(String label, UnitOfMeasurement unitOfMeasurement, SiPrefix siPrefix, Integer exponent) {
288         for (VifPrimary value : values()) {
289             if (value.getLabel().equals(label) && 
290                     ((unitOfMeasurement == value.getUnitOfMeasurement()) || ((unitOfMeasurement != null) && unitOfMeasurement.equals(value.getUnitOfMeasurement()))) && 
291                     ((siPrefix == value.getSiPrefix()) || ((siPrefix != null) && siPrefix.equals(value.getSiPrefix()))) && 
292                     ((exponent == value.getExponent()) || ((exponent != null) && exponent.equals(value.getExponent())))) {
293                 return value;
294             }
295         }
296         return valueOf(label);
297     }
298 
299     @Override
300     public VifTypes getVifType() {
301         return VifTypes.PRIMARY;
302     }
303 }