1   /* Copyright 2002-2024 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.gnss.metric.parser;
18  
19  import java.util.function.Function;
20  
21  /** Enum containing all low level data types that can be parsed
22   * to build a message.
23   * @author Luc Maisonobe
24   * @since 11.0
25   */
26  public enum DataType {
27  
28      /** 1 bit. */
29      BIT_1(m -> m.extractBits(1)),
30  
31      /** 2 bits. */
32      BIT_2(m -> m.extractBits(2)),
33  
34      /** 3 bits. */
35      BIT_3(m -> m.extractBits(3)),
36  
37      /** 4 bits. */
38      BIT_4(m -> m.extractBits(4)),
39  
40      /** 6 bits. */
41      BIT_6(m -> m.extractBits(6)),
42  
43      /** 7 bits. */
44      BIT_7(m -> m.extractBits(7)),
45  
46      /** 8 bits. */
47      BIT_8(m -> m.extractBits(8)),
48  
49      /** 10 bits. */
50      BIT_10(m -> m.extractBits(10)),
51  
52      /** 12 bits. */
53      BIT_12(m -> m.extractBits(12)),
54  
55      /** 24 bits. */
56      BIT_24(m -> m.extractBits(24)),
57  
58      /** 32 bits. */
59      BIT_32(m -> m.extractBits(32)),
60  
61      /** 6 bits signed integer. */
62      INT_6(m -> {
63          final long msb = 0x20l;
64          final long signed = (m.extractBits(6) ^ msb) - msb;
65          return signed == -msb ? null : signed; // return null for the special value meaning no data
66      }),
67  
68      /** 8 bits signed integer. */
69      INT_8(m -> {
70          final long msb = 0x80l;
71          final long signed = (m.extractBits(8) ^ msb) - msb;
72          return signed == -msb ? null : signed; // return null for the special value meaning no data
73      }),
74  
75      /** 9 bits signed integer. */
76      INT_9(m -> {
77          final long msb = 0x100l;
78          final long signed = (m.extractBits(9) ^ msb) - msb;
79          return signed == -msb ? null : signed; // return null for the special value meaning no data
80      }),
81  
82      /** 10 bits signed integer. */
83      INT_10(m -> {
84          final long msb = 0x200l;
85          final long signed = (m.extractBits(10) ^ msb) - msb;
86          return signed == -msb ? null : signed; // return null for the special value meaning no data
87      }),
88  
89      /** 11 bits signed integer. */
90      INT_11(m -> {
91          final long msb = 0x400l;
92          final long signed = (m.extractBits(11) ^ msb) - msb;
93          return signed == -msb ? null : signed; // return null for the special value meaning no data
94      }),
95  
96      /** 14 bits signed integer. */
97      INT_14(m -> {
98          final long msb = 0x2000l;
99          final long signed = (m.extractBits(14) ^ msb) - msb;
100         return signed == -msb ? null : signed; // return null for the special value meaning no data
101     }),
102 
103     /** 15 bits signed integer. */
104     INT_15(m -> {
105         final long msb = 0x4000l;
106         final long signed = (m.extractBits(15) ^ msb) - msb;
107         return signed == -msb ? null : signed; // return null for the special value meaning no data
108     }),
109 
110     /** 16 bits signed integer. */
111     INT_16(m -> {
112         final long msb    = 0x8000l;
113         final long signed = (m.extractBits(16) ^ msb) - msb;
114         return signed == -msb ? null : signed; // return null for the special value meaning no data
115     }),
116 
117     /** 17 bits signed integer. */
118     INT_17(m -> {
119         final long msb    = 0x10000l;
120         final long signed = (m.extractBits(17) ^ msb) - msb;
121         return signed == -msb ? null : signed; // return null for the special value meaning no data
122     }),
123 
124     /** 18 bits signed integer. */
125     INT_18(m -> {
126         final long msb    = 0x20000l;
127         final long signed = (m.extractBits(18) ^ msb) - msb;
128         return signed == -msb ? null : signed; // return null for the special value meaning no data
129     }),
130 
131     /** 19 bits signed integer. */
132     INT_19(m -> {
133         final long msb    = 0x40000l;
134         final long signed = (m.extractBits(19) ^ msb) - msb;
135         return signed == -msb ? null : signed; // return null for the special value meaning no data
136     }),
137 
138     /** 20 bits signed integer. */
139     INT_20(m -> {
140         final long msb    = 0x80000l;
141         final long signed = (m.extractBits(20) ^ msb) - msb;
142         return signed == -msb ? null : signed; // return null for the special value meaning no data
143     }),
144 
145     /** 21 bits signed integer. */
146     INT_21(m -> {
147         final long msb    = 0x100000l;
148         final long signed = (m.extractBits(21) ^ msb) - msb;
149         return signed == -msb ? null : signed; // return null for the special value meaning no data
150     }),
151 
152     /** 22 bits signed integer. */
153     INT_22(m -> {
154         final long msb    = 0x200000l;
155         final long signed = (m.extractBits(22) ^ msb) - msb;
156         return signed == -msb ? null : signed; // return null for the special value meaning no data
157     }),
158 
159     /** 23 bits signed integer. */
160     INT_23(m -> {
161         final long msb    = 0x400000l;
162         final long signed = (m.extractBits(23) ^ msb) - msb;
163         return signed == -msb ? null : signed; // return null for the special value meaning no data
164     }),
165 
166     /** 24 bits signed integer. */
167     INT_24(m -> {
168         final long msb    = 0x800000l;
169         final long signed = (m.extractBits(24) ^ msb) - msb;
170         return signed == -msb ? null : signed; // return null for the special value meaning no data
171     }),
172 
173     /** 25 bits signed integer. */
174     INT_25(m -> {
175         final long msb    = 0x1000000l;
176         final long signed = (m.extractBits(25) ^ msb) - msb;
177         return signed == -msb ? null : signed; // return null for the special value meaning no data
178     }),
179 
180     /** 26 bits signed integer. */
181     INT_26(m -> {
182         final long msb    = 0x2000000l;
183         final long signed = (m.extractBits(26) ^ msb) - msb;
184         return signed == -msb ? null : signed; // return null for the special value meaning no data
185     }),
186 
187     /** 27 bits signed integer. */
188     INT_27(m -> {
189         final long msb    = 0x4000000l;
190         final long signed = (m.extractBits(27) ^ msb) - msb;
191         return signed == -msb ? null : signed; // return null for the special value meaning no data
192     }),
193 
194     /** 30 bits signed integer. */
195     INT_30(m -> {
196         final long msb    = 0x20000000l;
197         final long signed = (m.extractBits(30) ^ msb) - msb;
198         return signed == -msb ? null : signed; // return null for the special value meaning no data
199     }),
200 
201     /** 31 bits signed integer. */
202     INT_31(m -> {
203         final long msb    = 0x40000000l;
204         final long signed = (m.extractBits(31) ^ msb) - msb;
205         return signed == -msb ? null : signed; // return null for the special value meaning no data
206     }),
207 
208     /** 32 bits signed integer. */
209     INT_32(m -> {
210         final long msb    = 0x80000000l;
211         final long signed = (m.extractBits(32) ^ msb) - msb;
212         return signed == -msb ? null : signed; // return null for the special value meaning no data
213     }),
214 
215     /** 34 bits signed integer. */
216     INT_34(m -> {
217         final long msb    = 0x200000000l;
218         final long signed = (m.extractBits(34) ^ msb) - msb;
219         return signed == -msb ? null : signed; // return null for the special value meaning no data
220     }),
221 
222     /** 35 bits signed integer. */
223     INT_35(m -> {
224         final long msb    = 0x400000000l;
225         final long signed = (m.extractBits(35) ^ msb) - msb;
226         return signed == -msb ? null : signed; // return null for the special value meaning no data
227     }),
228 
229     /** 38 bits signed integer. */
230     INT_38(m -> {
231         final long msb = 0x2000000000l;
232         final long signed = (m.extractBits(38) ^ msb) - msb;
233         return signed == -msb ? null : signed; // return null for the special value meaning no data
234     }),
235 
236     /** 2 bits unsigned integer. */
237     U_INT_2(m -> m.extractBits(2)),
238 
239     /** 3 bits unsigned integer. */
240     U_INT_3(m -> m.extractBits(3)),
241 
242     /** 4 bits unsigned integer. */
243     U_INT_4(m -> m.extractBits(4)),
244 
245     /** 5 bits unsigned integer. */
246     U_INT_5(m -> m.extractBits(5)),
247 
248     /** 6 bits unsigned integer. */
249     U_INT_6(m -> m.extractBits(6)),
250 
251     /** 7 bits unsigned integer. */
252     U_INT_7(m -> m.extractBits(7)),
253 
254     /** 8 bits unsigned integer. */
255     U_INT_8(m -> m.extractBits(8)),
256 
257     /** 9 bits unsigned integer. */
258     U_INT_9(m -> m.extractBits(9)),
259 
260     /** 10 bits unsigned integer. */
261     U_INT_10(m -> m.extractBits(10)),
262 
263     /** 11 bits unsigned integer. */
264     U_INT_11(m -> m.extractBits(11)),
265 
266     /** 12 bits unsigned integer. */
267     U_INT_12(m -> m.extractBits(12)),
268 
269     /** 13 bits unsigned integer. */
270     U_INT_13(m -> m.extractBits(13)),
271 
272     /** 14 bits unsigned integer. */
273     U_INT_14(m -> m.extractBits(14)),
274 
275     /** 16 bits unsigned integer. */
276     U_INT_16(m -> m.extractBits(16)),
277 
278     /** 17 bits unsigned integer. */
279     U_INT_17(m -> m.extractBits(17)),
280 
281     /** 18 bits unsigned integer. */
282     U_INT_18(m -> m.extractBits(18)),
283 
284     /** 20 bits unsigned integer. */
285     U_INT_20(m -> m.extractBits(20)),
286 
287     /** 23 bits unsigned integer. */
288     U_INT_23(m -> m.extractBits(23)),
289 
290     /** 24 bits unsigned integer. */
291     U_INT_24(m -> m.extractBits(24)),
292 
293     /** 25 bits unsigned integer. */
294     U_INT_25(m -> m.extractBits(25)),
295 
296     /** 26 bits unsigned integer. */
297     U_INT_26(m -> m.extractBits(26)),
298 
299     /** 27 bits unsigned integer. */
300     U_INT_27(m -> m.extractBits(27)),
301 
302     /** 30 bits unsigned integer. */
303     U_INT_30(m -> m.extractBits(30)),
304 
305     /** 32 bits unsigned integer. */
306     U_INT_32(m -> m.extractBits(32)),
307 
308     /** 35 bits unsigned integer. */
309     U_INT_35(m -> m.extractBits(35)),
310 
311     /** 36 bits unsigned integer. */
312     U_INT_36(m -> m.extractBits(36)),
313 
314     /** 5 bits sign-magnitude integer. */
315     INT_S_5(m -> {
316         final long data = m.extractBits(5);
317         final long mask = -(data >>> 4); // this mask allows avoiding a conditional below
318         return (~mask & data) | (mask & (16l - data));
319     }),
320 
321     /** 11 bits sign-magnitude integer. */
322     INT_S_11(m -> {
323         final long data = m.extractBits(11);
324         final long mask = -(data >>> 10); // this mask allows avoiding a conditional below
325         return (~mask & data) | (mask & (1024l - data));
326     }),
327 
328     /** 22 bits sign-magnitude integer. */
329     INT_S_22(m -> {
330         final long data = m.extractBits(22);
331         final long mask = -(data >>> 21); // this mask allows avoiding a conditional below
332         return (~mask & data) | (mask & (2097152l - data));
333     }),
334 
335     /** 24 bits sign-magnitude integer. */
336     INT_S_24(m -> {
337         final long data = m.extractBits(24);
338         final long mask = -(data >>> 23); // this mask allows avoiding a conditional below
339         return (~mask & data) | (mask & (8388608l - data));
340     }),
341 
342     /** 27 bits sign-magnitude integer. */
343     INT_S_27(m -> {
344         final long data = m.extractBits(27);
345         final long mask = -(data >>> 26); // this mask allows avoiding a conditional below
346         return (~mask & data) | (mask & (67108864l - data));
347     }),
348 
349     /** 32 bits sign-magnitude integer. */
350     INT_S_32(m -> {
351         final long data = m.extractBits(32);
352         final long mask = -(data >>> 31); // this mask allows avoiding a conditional below
353         return (~mask & data) | (mask & (2147483648l - data));
354     });
355 
356     /** Decoding function. */
357     private final Function<EncodedMessage, Long> decoder;
358 
359     /** Simple constructor.
360      * @param decoder decoding function for the data type
361      */
362     DataType(final Function<EncodedMessage, Long> decoder) {
363         this.decoder = decoder;
364     }
365 
366     /** Decode a piece of data extracted from an encoded message.
367      * @param message encoded message providing the bits to decode
368      * @return data decoded as a Long object, or null if data not available
369      */
370     public Long decode(final EncodedMessage message) {
371         return decoder.apply(message);
372     }
373 
374 }