1 package net.sf.mbus4j.dataframes.datablocks.vif;
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 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
41
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
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
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
112
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 }