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 java.util.Arrays;
31  import java.util.Collection;
32  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.DAY;
33  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.HOUR;
34  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.MINUTE;
35  import static net.sf.mbus4j.dataframes.datablocks.vif.UnitOfMeasurement.SECOND;
36  
37  
38  /**
39   *
40   * @author arnep@users.sourceforge.net
41   * @version $Id: VifePrimary.java 159 2016-05-13 08:33:29Z arnep $
42   */
43  public enum VifePrimary implements Vife {
44  
45      PER_SECOND("/s"),
46      PER_MINUTE("/min"),
47      PER_HOUR("/h"),
48      PER_DAY("/d"),
49      PER_WEEK("/week"),
50      PER_MONTH("/month"),
51      PER_YEAR("/year"),
52      PER_REVOLUTION("per revolution / measurement"),
53      INCREMENT_INPUT_0("increment per input pulse on input channel #0"),
54      INCREMENT_INPUT_1("increment per input pulse on input channel #1"),
55      INCREMENT_OUTPUT_0("increment per output pulse on output channel #0"),
56      INCREMENT_OUTPUT_1("increment per output pulse on output channel #1"),
57      PER_LITER("/l"),
58      PER_CUBIC_METER("/m³"),
59      PER_KG("/kg"),
60      PER_KELVIN("per K"),
61      PER_KWH("/kWh"),
62      PER_GJ("/GJ"),
63      PER_KW("/kW"),
64      PER_KELVIN_MUL_LITER("/(K*l)"),
65      PER_VOLT("/V"),
66      PER_AMPERE("/A"),
67      MUL_BY_SEC("* s"),
68      MUL_BY_SEC_PER_VOLT("* s/V"),
69      MUL_BY_SEC_PER_AMPERE("* s/A"),
70      START_DATE_TIME_OF("start date(/time) of"),
71      UNCORRECTED_UNIT("VIF contains uncorrected unit instead of corrected unit"),
72      ACCUMULATION_POSITIVE("Accumulation only if positive contributions"),
73      ACCUMULATION_ABS_NEGATIVE("Accumulation of abs value only if negative contributions"),
74      RESERVED_0X3D(),
75      RESERVED_0X3E(),
76      RESERVED_0X3F(),
77      // 0x40
78      LOWER_LIMIT("lower limit value"),
79      EXCEEDS_LOWER_LIMIT("# of exceeds of lower limit"),
80      TIMESTAMP_OF_BEGIN_FIRST_LOWER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, BEGIN, FIRST, LOWER)),
81      TIMESTAMP_OF_END_FIRST_LOWER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, END, FIRST, LOWER)),
82      RESERVED_0X44(),
83      RESERVED_0X45(),
84      TIMESTAMP_BEGIN_LAST_LOWER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, BEGIN, LAST, LOWER)),
85      TIMESTAMP_END_LAST_LOWER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, END, LAST, LOWER)),
86      UPPER_LIMIT("upper limit value"),
87      EXCEEDS_UPPER_LIMIT("# of exceeds of upper limit"),
88      TIMESTAMP_BEGIN_FIRST_UPPER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, BEGIN, FIRST, UPPER)),
89      TIMESTAMP_END_FIRST_UPPER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, END, FIRST, UPPER)),
90      RESERVED_0X4C(),
91      RESERVED_0X4D(),
92      TIMESTAMP_BEGIN_LAST_UPPER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, BEGIN, LAST, UPPER)),
93      TIMESTAMP_END_LAST_UPPER(String.format(TIMESTAMP_OF_LIMIT_EXCEED, END, LAST, UPPER)),
94      //    0x50
95      DURATION_OF_LIMIT_EXCEED_FIRST_LOWER_S(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, LOWER, SECOND)),
96      DURATION_OF_LIMIT_EXCEED_FIRST_LOWER_MIN(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, LOWER, MINUTE)),
97      DURATION_OF_LIMIT_EXCEED_FIRST_LOWER_H(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, LOWER, HOUR)),
98      DURATION_OF_LIMIT_EXCEED_FIRST_LOWER_D(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, LOWER, DAY)),
99      DURATION_OF_LIMIT_EXCEED_LAST_LOWER_S(String.format(DURATION_OF_LIMIT_EXCEED, LAST, LOWER, SECOND)),
100     DURATION_OF_LIMIT_EXCEED_LAST_LOWER_MIN(String.format(DURATION_OF_LIMIT_EXCEED, LAST, LOWER, MINUTE)),
101     DURATION_OF_LIMIT_EXCEED_LAST_LOWER_H(String.format(DURATION_OF_LIMIT_EXCEED, LAST, LOWER, HOUR)),
102     DURATION_OF_LIMIT_EXCEED_LAST_LOWER_D(String.format(DURATION_OF_LIMIT_EXCEED, LAST, LOWER, DAY)),
103     DURATION_OF_LIMIT_EXCEED_FIRST_UPPER_S(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, UPPER, SECOND)),
104     DURATION_OF_LIMIT_EXCEED_FIRST_UPPER_MIN(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, UPPER, MINUTE)),
105     DURATION_OF_LIMIT_EXCEED_FIRST_UPPER_H(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, UPPER, HOUR)),
106     DURATION_OF_LIMIT_EXCEED_FIRST_UPPER_D(String.format(DURATION_OF_LIMIT_EXCEED, FIRST, UPPER, DAY)),
107     DURATION_OF_LIMIT_EXCEED_LAST_UPPER_S(String.format(DURATION_OF_LIMIT_EXCEED, LAST, UPPER, SECOND)),
108     DURATION_OF_LIMIT_EXCEED_LAST_UPPER_MIN(String.format(DURATION_OF_LIMIT_EXCEED, LAST, UPPER, MINUTE)),
109     DURATION_OF_LIMIT_EXCEED_LAST_UPPER_H(String.format(DURATION_OF_LIMIT_EXCEED, LAST, UPPER, HOUR)),
110     DURATION_OF_LIMIT_EXCEED_LAST_UPPER_D(String.format(DURATION_OF_LIMIT_EXCEED, LAST, UPPER, DAY)),
111     //0x60
112     //  DURATION_OF
113     DURATION_OF_FIRST_S(String.format(DURATION_OF, FIRST, SECOND)),
114     DURATION_OF_FIRST_MIN(String.format(DURATION_OF, FIRST, MINUTE)),
115     DURATION_OF_FIRST_H(String.format(DURATION_OF, FIRST, HOUR)),
116     DURATION_OF_FIRST_D(String.format(DURATION_OF, FIRST, DAY)),
117     DURATION_OF_LAST_S(String.format(DURATION_OF, LAST, SECOND)),
118     DURATION_OF_LAST_MIN(String.format(DURATION_OF, LAST, MINUTE)),
119     DURATION_OF_LAST_H(String.format(DURATION_OF, LAST, HOUR)),
120     DURATION_OF_LAST_D(String.format(DURATION_OF, LAST, DAY)),
121     RESERVED_0X68(),
122     RESERVED_0X69(),
123     TIMESTAMP_BEGIN_OF_FIRST(String.format(TIMESTAMP_OF, BEGIN, FIRST)),
124     TIMESTAMP_END_OF_FIRST(String.format(TIMESTAMP_OF, END, FIRST)),
125     RESERVED_0X6C(),
126     RESERVED_0X6D(),
127     TIMESTAMP_BEGIN_OF_LAST(String.format(TIMESTAMP_OF, BEGIN, END)),
128     TIMESTAMP_END_OF_LAST(String.format(TIMESTAMP_OF, END, LAST)),
129     FACTOR_E__6(FACTOR + " 0.000001"),
130     FACTOR_E__5(FACTOR + " 0.00001"),
131     FACTOR_E__4(FACTOR + " 0.0001"),
132     FACTOR_E__3(FACTOR + " 0.001"),
133     FACTOR_E__2(FACTOR + " 0.01"),
134     FACTOR_E__1(FACTOR + " 0.1"),
135     FACTOR_E_0(FACTOR + " 1"),
136     FACTOR_E_1(FACTOR + " 10"),
137     CONST_E__3(CONST + "0.001"),
138     CONST_E__2(CONST + "0.01"),
139     CONST_E__1(CONST + "0.1"),
140     CONST_E_0(CONST + " 1"),
141     RESERVED_0X7C(),
142     FACTOR_E_3(FACTOR + " 1000"),
143     FUTUR_VALUE("future value"),
144     MAN_SPEC("next VIFE's and data of this block are manufacturer specific");
145 
146     public final static int CODE_OFFSET = 0x20;
147     
148     public final static VifePrimary valueOfTableIndex(byte ordinal) {
149             return map[ordinal - CODE_OFFSET];
150     }
151 
152     public static boolean isTimestampVife(Collection<Vife> vifes) {
153         if (vifes == null) {
154             return false;
155         }
156         Collection<Vife> timeVifes = Arrays.asList(new Vife[]{TIMESTAMP_OF_BEGIN_FIRST_LOWER, TIMESTAMP_OF_END_FIRST_LOWER, TIMESTAMP_BEGIN_LAST_LOWER, TIMESTAMP_END_LAST_LOWER, TIMESTAMP_BEGIN_FIRST_UPPER, TIMESTAMP_END_FIRST_UPPER, TIMESTAMP_BEGIN_LAST_UPPER, TIMESTAMP_END_LAST_UPPER, TIMESTAMP_BEGIN_OF_FIRST, TIMESTAMP_END_OF_FIRST, TIMESTAMP_BEGIN_OF_LAST, TIMESTAMP_END_OF_LAST});
157         int result = 0;
158         for (Vife vife : vifes) {
159             if (timeVifes.contains(vife)) {
160                 result++;
161             }
162         }
163         return result == 1;
164     }
165     private final String label;
166     private final static VifePrimary[] map = values();
167 
168     private VifePrimary() {
169         this.label = String.format("Reserved 0x%02x", ordinal() + 0x20);
170     }
171 
172     private VifePrimary(String friendlyName) {
173         this.label = friendlyName;
174     }
175 
176     public byte getTableIndex() {
177         return (byte) (ordinal() + 0x20);
178     }
179 
180     @Override
181     public String toString() {
182         return label;
183     }
184 
185     @Override
186     public String getLabel() {
187         return label;
188     }
189 
190     @Override
191     public VifeTypes getVifeType() {
192         return VifeTypes.PRIMARY;
193     }
194 
195     public static VifePrimary fromLabel(String label) {
196         for (VifePrimary value : map) {
197             if (value.getLabel().equals(label)) {
198                 return value;
199             }
200         }
201         return valueOf(label);
202     }
203     
204     public static double getVifeCorrectionFactor(Vife[] vifes) {
205         for (Vife vife : vifes) {
206             if (vife instanceof VifePrimary) {
207                 switch ((VifePrimary)vife) {
208                     case FACTOR_E__6: return 0.000001;
209                     case FACTOR_E__5: return 0.00001;
210                     case FACTOR_E__4: return 0.0001;
211                     case FACTOR_E__3: return 0.001;
212                     case FACTOR_E__2: return 0.01;
213                     case FACTOR_E__1: return 0.1;
214                     case FACTOR_E_0:return 1.0;
215                     case FACTOR_E_1:return 10.0;
216                     case FACTOR_E_3:return 1000.0;
217                     default: ;
218                 }
219             }
220         }
221         return Double.NaN;
222     }
223 
224     public static int getVifeCorrectionExponent(Vife[] vifes) {
225         for (Vife vife : vifes) {
226             if (vife instanceof VifePrimary) {
227                 switch ((VifePrimary)vife) {
228                     case FACTOR_E__6: return -6;
229                     case FACTOR_E__5: return -5;
230                     case FACTOR_E__4: return -4;
231                     case FACTOR_E__3: return -3;
232                     case FACTOR_E__2: return -2;
233                     case FACTOR_E__1: return -1;
234                     case FACTOR_E_0:return 0;
235                     case FACTOR_E_1:return 1;
236                     case FACTOR_E_3:return 3;
237                     default: ;
238                 }
239             }
240         }
241         return 0;
242     }
243 
244     public static double getVifeCorrectionConstant(Vife[] vifes) {
245         for (Vife vife : vifes) {
246             if (vife instanceof VifePrimary) {
247                 switch ((VifePrimary)vife) {
248                     case CONST_E_0: return 1;
249                     case CONST_E__1: return 0.1;
250                     case CONST_E__2: return 0.01;
251                     case CONST_E__3: return 0.001;
252                     default: ;
253                 }
254             }
255         }
256         return Double.NaN;
257     }
258 }