1   /* Copyright 2002-2021 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.Locale;
20  
21  import org.hipparchus.util.FastMath;
22  import org.orekit.utils.units.Unit;
23  
24  /** Enum containing all intermediate level data fields that can be parsed
25   * to build a RTCM message.
26   * @author Bryan Cazabonne
27   * @since 11.0
28   */
29  public enum RtcmDataField implements DataField {
30  
31      /** RTCM Message number. */
32      DF002 {
33          /** {@inheritDoc} */
34          @Override
35          public String stringValue(final EncodedMessage message, final int n) {
36              return String.format(Locale.US, "%4s", DataType.U_INT_12.decode(message).intValue()).trim();
37          }
38      },
39  
40      /** GPS Satellite ID. */
41      DF009 {
42          /** {@inheritDoc} */
43          @Override
44          public int intValue(final EncodedMessage message) {
45              return DataType.U_INT_6.decode(message).intValue();
46          }
47      },
48  
49      /** GLONASS Satellite ID. */
50      DF038 {
51          /** {@inheritDoc} */
52          @Override
53          public int intValue(final EncodedMessage message) {
54              return DataType.U_INT_6.decode(message).intValue();
55          }
56      },
57  
58      /** GLONASS Satellite Frequency Channel Number. */
59      DF040 {
60          /** {@inheritDoc} */
61          @Override
62          public int intValue(final EncodedMessage message) {
63              final int id = DataType.U_INT_5.decode(message).intValue();
64              return id - 7;
65          }
66      },
67  
68      /** GPS IODE (Issue Of Data, Ephemeris). */
69      DF071 {
70          /** {@inheritDoc} */
71          @Override
72          public int intValue(final EncodedMessage message) {
73              return DataType.BIT_8.decode(message).intValue();
74          }
75      },
76  
77      /** GPS Week number. */
78      DF076 {
79          /** {@inheritDoc} */
80          @Override
81          public int intValue(final EncodedMessage message) {
82              return DataType.U_INT_10.decode(message).intValue();
83          }
84      },
85  
86      /** GPS SV Accuracy. */
87      DF077 {
88          /** {@inheritDoc} */
89          @Override
90          public int intValue(final EncodedMessage message) {
91              return DataType.U_INT_4.decode(message).intValue();
92          }
93      },
94  
95      /** GPS CODE ON L2. */
96      DF078 {
97          /** {@inheritDoc} */
98          @Override
99          public int intValue(final EncodedMessage message) {
100             return DataType.BIT_2.decode(message).intValue();
101         }
102     },
103 
104     /** GPS Rate of Inclination Angle. */
105     DF079 {
106         /** {@inheritDoc} */
107         @Override
108         public double doubleValue(final EncodedMessage message) {
109             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
110         }
111     },
112 
113     /** GPS toc. */
114     DF081 {
115         /** {@inheritDoc} */
116         @Override
117         public double doubleValue(final EncodedMessage message) {
118             return DataType.U_INT_16.decode(message).intValue() * 16.0;
119         }
120     },
121 
122     /** GPS a<sub>f2</sub>. */
123     DF082 {
124         /** {@inheritDoc} */
125         @Override
126         public double doubleValue(final EncodedMessage message) {
127             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -55);
128         }
129     },
130 
131     /** GPS a<sub>f1</sub>. */
132     DF083 {
133         /** {@inheritDoc} */
134         @Override
135         public double doubleValue(final EncodedMessage message) {
136             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43);
137         }
138     },
139 
140     /** GPS a<sub>f0</sub>. */
141     DF084 {
142         /** {@inheritDoc} */
143         @Override
144         public double doubleValue(final EncodedMessage message) {
145             return FastMath.scalb(DataType.INT_22.decode(message).intValue(), -31);
146         }
147     },
148 
149     /** GPS IODC (Issue Of Data, Clock). */
150     DF085 {
151         /** {@inheritDoc} */
152         @Override
153         public int intValue(final EncodedMessage message) {
154             return DataType.U_INT_10.decode(message).intValue();
155         }
156     },
157 
158     /** GPS C<sub>rs</sub>. */
159     DF086 {
160         /** {@inheritDoc} */
161         @Override
162         public double doubleValue(final EncodedMessage message) {
163             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
164         }
165     },
166 
167     /** GPS Δn (DELTA n). */
168     DF087 {
169         /** {@inheritDoc} */
170         @Override
171         public double doubleValue(final EncodedMessage message) {
172             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
173         }
174     },
175 
176     /** GPS M<sub>0</sub>. */
177     DF088 {
178         /** {@inheritDoc} */
179         @Override
180         public double doubleValue(final EncodedMessage message) {
181             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
182         }
183     },
184 
185     /** GPS C<sub>uc</sub>. */
186     DF089 {
187         /** {@inheritDoc} */
188         @Override
189         public double doubleValue(final EncodedMessage message) {
190             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
191         }
192     },
193 
194     /** GPS Eccentricity (e). */
195     DF090 {
196         /** {@inheritDoc} */
197         @Override
198         public double doubleValue(final EncodedMessage message) {
199             return FastMath.scalb(DataType.U_INT_32.decode(message).longValue(), -33);
200         }
201     },
202 
203     /** GPS C<sub>us</sub>. */
204     DF091 {
205         /** {@inheritDoc} */
206         @Override
207         public double doubleValue(final EncodedMessage message) {
208             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
209         }
210     },
211 
212     /** GPS A<sup>1/2</sup>. */
213     DF092 {
214         /** {@inheritDoc} */
215         @Override
216         public double doubleValue(final EncodedMessage message) {
217             return FastMath.scalb(DataType.U_INT_32.decode(message).longValue(), -19);
218         }
219     },
220 
221     /** GPS t<sub>oe</sub>. */
222     DF093 {
223         /** {@inheritDoc} */
224         @Override
225         public double doubleValue(final EncodedMessage message) {
226             return DataType.U_INT_16.decode(message).intValue() * 16.0;
227         }
228     },
229 
230     /** GPS C<sub>ic</sub>. */
231     DF094 {
232         /** {@inheritDoc} */
233         @Override
234         public double doubleValue(final EncodedMessage message) {
235             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
236         }
237     },
238 
239     /** GPS Ω<sub>0</sub> (OMEGA)<sub>0</sub>. */
240     DF095 {
241         /** {@inheritDoc} */
242         @Override
243         public double doubleValue(final EncodedMessage message) {
244             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
245         }
246     },
247 
248     /** GPS C<sub>is</sub>. */
249     DF096 {
250         /** {@inheritDoc} */
251         @Override
252         public double doubleValue(final EncodedMessage message) {
253             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
254         }
255     },
256 
257     /** GPS i<sub>0</sub>. */
258     DF097 {
259         /** {@inheritDoc} */
260         @Override
261         public double doubleValue(final EncodedMessage message) {
262             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
263         }
264     },
265 
266     /** GPS C<sub>rc</sub>. */
267     DF098 {
268         /** {@inheritDoc} */
269         @Override
270         public double doubleValue(final EncodedMessage message) {
271             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
272         }
273     },
274 
275     /** GPS ω (Argument of Perigee). */
276     DF099 {
277         /** {@inheritDoc} */
278         @Override
279         public double doubleValue(final EncodedMessage message) {
280             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
281         }
282     },
283 
284     /** GPS OMEGADOT (Rate of Right Ascension). */
285     DF100 {
286         /** {@inheritDoc} */
287         @Override
288         public double doubleValue(final EncodedMessage message) {
289             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
290         }
291     },
292 
293     /** GPS t<sub>GD</sub>. */
294     DF101 {
295         /** {@inheritDoc} */
296         @Override
297         public double doubleValue(final EncodedMessage message) {
298             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -31);
299         }
300     },
301 
302     /** GPS SV HEALTH. */
303     DF102 {
304         /** {@inheritDoc} */
305         @Override
306         public int intValue(final EncodedMessage message) {
307             return DataType.U_INT_6.decode(message).intValue();
308         }
309     },
310 
311     /** GPS L2 P data flag. */
312     DF103 {
313         /** {@inheritDoc} */
314         @Override
315         public boolean booleanValue(final EncodedMessage message) {
316             return DataType.BIT_1.decode(message) == 0;
317         }
318     },
319 
320     /** GLONASS almanac health (C<sub>n</sub> word). */
321     DF104 {
322         /** {@inheritDoc} */
323         @Override
324         public int intValue(final EncodedMessage message) {
325             return DataType.BIT_1.decode(message).intValue();
326         }
327     },
328 
329     /** GLONASS almanac health availability indicator. */
330     DF105 {
331         /** {@inheritDoc} */
332         @Override
333         public boolean booleanValue(final EncodedMessage message) {
334             return DataType.BIT_1.decode(message) > 0;
335         }
336     },
337 
338     /** GLONASS P1. */
339     DF106 {
340         /** {@inheritDoc} */
341         @Override
342         public int intValue(final EncodedMessage message) {
343             // Word P1 indicates a time interval (in sec) between two adjacent values of tb parameter
344             switch(DataType.BIT_2.decode(message).intValue()) {
345                 case 0  : return 0;
346                 case 1  : return 1800;
347                 case 2  : return 2700;
348                 default : return 3600;
349             }
350         }
351     },
352 
353     /** GLONASS t<sub>k</sub> (s). */
354     DF107 {
355         /** {@inheritDoc} */
356         @Override
357         public double doubleValue(final EncodedMessage message) {
358             final int    hours    = DataType.U_INT_5.decode(message).intValue();
359             final int    minutes  = DataType.U_INT_6.decode(message).intValue();
360             final double secondes = DataType.BIT_1.decode(message).intValue() * 30.0;
361             return hours * 3600.0 + minutes * 60.0 + secondes;
362         }
363     },
364 
365     /** GLONASS MSB of B<sub>n</sub> word. */
366     DF108 {
367         /** {@inheritDoc} */
368         @Override
369         public int intValue(final EncodedMessage message) {
370             return DataType.BIT_1.decode(message).intValue();
371         }
372     },
373 
374     /** GLONASS P2 Flag. */
375     DF109 {
376         /** {@inheritDoc} */
377         @Override
378         public int intValue(final EncodedMessage message) {
379             return DataType.BIT_1.decode(message).intValue();
380         }
381     },
382 
383     /** GLONASS t<sub>b</sub>. */
384     DF110 {
385         /** {@inheritDoc} */
386         @Override
387         public double doubleValue(final EncodedMessage message) {
388             return Unit.MINUTE.toSI(DataType.U_INT_7.decode(message).intValue() * 15.0);
389         }
390     },
391 
392     /** GLONASS x<sub>n</sub> (t<sub>b</sub>), first derivative. */
393     DF111 {
394         /** {@inheritDoc} */
395         @Override
396         public double doubleValue(final EncodedMessage message) {
397             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).intValue(), -20));
398         }
399     },
400 
401     /** GLONASS x<sub>n</sub> (t<sub>b</sub>). */
402     DF112 {
403         /** {@inheritDoc} */
404         @Override
405         public double doubleValue(final EncodedMessage message) {
406             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).intValue(), -11));
407         }
408     },
409 
410     /** GLONASS x<sub>n</sub> (t<sub>b</sub>), second derivative. */
411     DF113 {
412         /** {@inheritDoc} */
413         @Override
414         public double doubleValue(final EncodedMessage message) {
415             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30));
416         }
417     },
418 
419     /** GLONASS y<sub>n</sub> (t<sub>b</sub>), first derivative. */
420     DF114 {
421         /** {@inheritDoc} */
422         @Override
423         public double doubleValue(final EncodedMessage message) {
424             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).intValue(), -20));
425         }
426     },
427 
428     /** GLONASS y<sub>n</sub> (t<sub>b</sub>). */
429     DF115 {
430         /** {@inheritDoc} */
431         @Override
432         public double doubleValue(final EncodedMessage message) {
433             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).intValue(), -11));
434         }
435     },
436 
437     /** GLONASS y<sub>n</sub> (t<sub>b</sub>), second derivative. */
438     DF116 {
439         /** {@inheritDoc} */
440         @Override
441         public double doubleValue(final EncodedMessage message) {
442             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30));
443         }
444     },
445 
446     /** GLONASS z<sub>n</sub> (t<sub>b</sub>), first derivative. */
447     DF117 {
448         /** {@inheritDoc} */
449         @Override
450         public double doubleValue(final EncodedMessage message) {
451             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).intValue(), -20));
452         }
453     },
454 
455     /** GLONASS z<sub>n</sub> (t<sub>b</sub>). */
456     DF118 {
457         /** {@inheritDoc} */
458         @Override
459         public double doubleValue(final EncodedMessage message) {
460             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).intValue(), -11));
461         }
462     },
463 
464     /** GLONASS z<sub>n</sub> (t<sub>b</sub>), second derivative. */
465     DF119 {
466         /** {@inheritDoc} */
467         @Override
468         public double doubleValue(final EncodedMessage message) {
469             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30));
470         }
471     },
472 
473     /** GLONASS P3 Flag. */
474     DF120 {
475         /** {@inheritDoc} */
476         @Override
477         public int intValue(final EncodedMessage message) {
478             // Flag indicating a number of satellites for which almanac is transmitted within given frame
479             if (DataType.BIT_1.decode(message) == 0) {
480                 return 4;
481             } else {
482                 return 5;
483             }
484         }
485     },
486 
487     /** GLONASS γ<sub>n</sub> (t<sub>b</sub>). */
488     DF121 {
489         /** {@inheritDoc} */
490         @Override
491         public double doubleValue(final EncodedMessage message) {
492             return FastMath.scalb(DataType.INT_S_11.decode(message).intValue(), -40);
493         }
494     },
495 
496     /** GLONASS-M P. */
497     DF122 {
498         /** {@inheritDoc} */
499         @Override
500         public int intValue(final EncodedMessage message) {
501             return DataType.BIT_2.decode(message).intValue();
502         }
503     },
504 
505     /** GLONASS-M l<sub>n</sub> (third string). */
506     DF123 {
507         /** {@inheritDoc} */
508         @Override
509         public int intValue(final EncodedMessage message) {
510             return DataType.BIT_1.decode(message).intValue();
511         }
512     },
513 
514     /** GLONASS τ<sub>n</sub> (t<sub>b</sub>). */
515     DF124 {
516         /** {@inheritDoc} */
517         @Override
518         public double doubleValue(final EncodedMessage message) {
519             return FastMath.scalb(DataType.INT_S_22.decode(message).intValue(), -30);
520         }
521     },
522 
523     /** GLONASS Δτ<sub>n</sub>. */
524     DF125 {
525         /** {@inheritDoc} */
526         @Override
527         public double doubleValue(final EncodedMessage message) {
528             return FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30);
529         }
530     },
531 
532     /** GLONASS E<sub>n</sub>. */
533     DF126 {
534         /** {@inheritDoc} */
535         @Override
536         public int intValue(final EncodedMessage message) {
537             return DataType.U_INT_5.decode(message).intValue();
538         }
539     },
540 
541     /** GLONASS-M P4. */
542     DF127 {
543         /** {@inheritDoc} */
544         @Override
545         public int intValue(final EncodedMessage message) {
546             return DataType.BIT_1.decode(message).intValue();
547         }
548     },
549 
550     /** GLONASS-M F<sub>T</sub>. */
551     DF128 {
552         /** {@inheritDoc} */
553         @Override
554         public int intValue(final EncodedMessage message) {
555             return DataType.U_INT_4.decode(message).intValue();
556         }
557     },
558 
559     /** GLONASS-M N<sub>T</sub>. */
560     DF129 {
561         /** {@inheritDoc} */
562         @Override
563         public int intValue(final EncodedMessage message) {
564             return DataType.U_INT_11.decode(message).intValue();
565         }
566     },
567 
568     /** GLONASS-M M. */
569     DF130 {
570         /** {@inheritDoc} */
571         @Override
572         public int intValue(final EncodedMessage message) {
573             return DataType.BIT_2.decode(message).intValue();
574         }
575     },
576 
577     /** GLONASS The Availability of Additional Data. */
578     DF131 {
579         /** {@inheritDoc} */
580         @Override
581         public boolean booleanValue(final EncodedMessage message) {
582             return DataType.BIT_1.decode(message) > 0;
583         }
584     },
585 
586     /** GLONASS N<sup>A</sup>. */
587     DF132 {
588         /** {@inheritDoc} */
589         @Override
590         public int intValue(final EncodedMessage message) {
591             return DataType.U_INT_11.decode(message).intValue();
592         }
593     },
594 
595     /** GLONASS τ<sub>c</sub>. */
596     DF133 {
597         /** {@inheritDoc} */
598         @Override
599         public double doubleValue(final EncodedMessage message) {
600             return FastMath.scalb(DataType.INT_S_32.decode(message).intValue(), -31);
601         }
602     },
603 
604     /** GLONASS-M N<sub>4</sub>. */
605     DF134 {
606         /** {@inheritDoc} */
607         @Override
608         public int intValue(final EncodedMessage message) {
609             return DataType.U_INT_5.decode(message).intValue();
610         }
611     },
612 
613     /** GLONASS τ<sub>GPS</sub>. */
614     DF135 {
615         /** {@inheritDoc} */
616         @Override
617         public double doubleValue(final EncodedMessage message) {
618             return FastMath.scalb(DataType.INT_S_22.decode(message).intValue(), -31);
619         }
620     },
621 
622     /** GLONASS-M l<sub>n</sub> (fifth string). */
623     DF136 {
624         /** {@inheritDoc} */
625         @Override
626         public int intValue(final EncodedMessage message) {
627             return DataType.BIT_1.decode(message).intValue();
628         }
629     },
630 
631     /** GPS Fit Interval. */
632     DF137 {
633         /** {@inheritDoc} */
634         @Override
635         public int intValue(final EncodedMessage message) {
636             return DataType.BIT_1.decode(message).intValue();
637         }
638     },
639 
640     /** Galileo Satellite ID. */
641     DF252 {
642         /** {@inheritDoc} */
643         @Override
644         public int intValue(final EncodedMessage message) {
645             return DataType.U_INT_6.decode(message).intValue();
646         }
647     },
648 
649     /** Galileo Week Number (WN). */
650     DF289 {
651         /** {@inheritDoc} */
652         @Override
653         public int intValue(final EncodedMessage message) {
654             return DataType.U_INT_12.decode(message).intValue();
655         }
656     },
657 
658     /** Galileo IODnav. */
659     DF290 {
660         /** {@inheritDoc} */
661         @Override
662         public int intValue(final EncodedMessage message) {
663             return DataType.U_INT_10.decode(message).intValue();
664         }
665     },
666 
667     /** Galileo SV SISA. */
668     DF291 {
669         /** {@inheritDoc} */
670         @Override
671         public int intValue(final EncodedMessage message) {
672             return DataType.BIT_8.decode(message).intValue();
673         }
674     },
675 
676     /** Galileo IDOT. */
677     DF292 {
678         /** {@inheritDoc} */
679         @Override
680         public double doubleValue(final EncodedMessage message) {
681             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
682         }
683     },
684 
685     /** Galileo t<sub>oc</sub>. */
686     DF293 {
687         /** {@inheritDoc} */
688         @Override
689         public double doubleValue(final EncodedMessage message) {
690             return DataType.U_INT_14.decode(message).intValue() * 60.0;
691         }
692     },
693 
694     /** Galileo a<sub>f2</sub>. */
695     DF294 {
696         /** {@inheritDoc} */
697         @Override
698         public double doubleValue(final EncodedMessage message) {
699             return FastMath.scalb(DataType.INT_6.decode(message).intValue(), -59);
700         }
701     },
702 
703     /** Galileo a<sub>f1</sub>. */
704     DF295 {
705         /** {@inheritDoc} */
706         @Override
707         public double doubleValue(final EncodedMessage message) {
708             return FastMath.scalb(DataType.INT_21.decode(message).intValue(), -46);
709         }
710     },
711 
712     /** Galileo a<sub>f0</sub>. */
713     DF296 {
714         /** {@inheritDoc} */
715         @Override
716         public double doubleValue(final EncodedMessage message) {
717             return FastMath.scalb(DataType.INT_31.decode(message).intValue(), -34);
718         }
719     },
720 
721     /** Galileo C<sub>rs</sub>. */
722     DF297 {
723         /** {@inheritDoc} */
724         @Override
725         public double doubleValue(final EncodedMessage message) {
726             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
727         }
728     },
729 
730     /** Galileo Δn. */
731     DF298 {
732         /** {@inheritDoc} */
733         @Override
734         public double doubleValue(final EncodedMessage message) {
735             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
736         }
737     },
738 
739     /** Galileo M<sub>0</sub>. */
740     DF299 {
741         /** {@inheritDoc} */
742         @Override
743         public double doubleValue(final EncodedMessage message) {
744             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
745         }
746     },
747 
748     /** Galileo C<sub>uc</sub>. */
749     DF300 {
750         /** {@inheritDoc} */
751         @Override
752         public double doubleValue(final EncodedMessage message) {
753             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
754         }
755     },
756 
757     /** Galileo e. */
758     DF301 {
759         /** {@inheritDoc} */
760         @Override
761         public double doubleValue(final EncodedMessage message) {
762             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
763         }
764     },
765 
766     /** Galileo C<sub>us</sub>. */
767     DF302 {
768         /** {@inheritDoc} */
769         @Override
770         public double doubleValue(final EncodedMessage message) {
771             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
772         }
773     },
774 
775     /** Galileo A<sup>1/2</sup>. */
776     DF303 {
777         /** {@inheritDoc} */
778         @Override
779         public double doubleValue(final EncodedMessage message) {
780             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
781         }
782     },
783 
784     /** Galileo t<sub>oe</sub>. */
785     DF304 {
786         /** {@inheritDoc} */
787         @Override
788         public double doubleValue(final EncodedMessage message) {
789             return DataType.U_INT_14.decode(message).intValue() * 60.0;
790         }
791     },
792 
793     /** Galileo C<sub>ic</sub>. */
794     DF305 {
795         /** {@inheritDoc} */
796         @Override
797         public double doubleValue(final EncodedMessage message) {
798             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
799         }
800     },
801 
802     /** Galileo Ω<sub>0</sub>. */
803     DF306 {
804         /** {@inheritDoc} */
805         @Override
806         public double doubleValue(final EncodedMessage message) {
807             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
808         }
809     },
810 
811     /** Galileo C<sub>is</sub>. */
812     DF307 {
813         /** {@inheritDoc} */
814         @Override
815         public double doubleValue(final EncodedMessage message) {
816             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
817         }
818     },
819 
820     /** Galileo i<sub>0</sub>. */
821     DF308 {
822         /** {@inheritDoc} */
823         @Override
824         public double doubleValue(final EncodedMessage message) {
825             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
826         }
827     },
828 
829     /** Galileo C<sub>rc</sub>. */
830     DF309 {
831         /** {@inheritDoc} */
832         @Override
833         public double doubleValue(final EncodedMessage message) {
834             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
835         }
836     },
837 
838     /** Galileo ω. */
839     DF310 {
840         /** {@inheritDoc} */
841         @Override
842         public double doubleValue(final EncodedMessage message) {
843             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
844         }
845     },
846 
847     /** Galileo OMEGADOT (Rate of Right Ascension). */
848     DF311 {
849         /** {@inheritDoc} */
850         @Override
851         public double doubleValue(final EncodedMessage message) {
852             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
853         }
854     },
855 
856     /** Galileo BGD (E1/E5a). */
857     DF312 {
858         /** {@inheritDoc} */
859         @Override
860         public double doubleValue(final EncodedMessage message) {
861             return FastMath.scalb(DataType.INT_10.decode(message).intValue(), -32);
862         }
863     },
864 
865     /** Galileo BGD (E5b/E1). */
866     DF313 {
867         /** {@inheritDoc} */
868         @Override
869         public double doubleValue(final EncodedMessage message) {
870             return FastMath.scalb(DataType.INT_10.decode(message).intValue(), -32);
871         }
872     },
873 
874     /** E5a SIGNAL Health Status. */
875     DF314 {
876         /** {@inheritDoc} */
877         @Override
878         public int intValue(final EncodedMessage message) {
879             return DataType.BIT_2.decode(message).intValue();
880         }
881     },
882 
883     /** E5a Data Validity Status. */
884     DF315 {
885         /** {@inheritDoc} */
886         @Override
887         public int intValue(final EncodedMessage message) {
888             return DataType.BIT_1.decode(message).intValue();
889         }
890     },
891 
892     /** Galileo SOL NAV Signal Health Status (SOLHS). */
893     DF316 {
894         /** {@inheritDoc} */
895         @Override
896         public int intValue(final EncodedMessage message) {
897             return DataType.BIT_2.decode(message).intValue();
898         }
899     },
900 
901     /** Galileo SOL NAV Data Validity Status (SOLDVS). */
902     DF317 {
903         /** {@inheritDoc} */
904         @Override
905         public int intValue(final EncodedMessage message) {
906             return DataType.BIT_1.decode(message).intValue();
907         }
908     },
909 
910     /** QZSS Satellite ID. */
911     DF429 {
912         /** {@inheritDoc} */
913         @Override
914         public int intValue(final EncodedMessage message) {
915             // 1 refers to satellite 193, 2 refers to satellite 194, etc.
916             return DataType.U_INT_4.decode(message).intValue() + 192;
917         }
918     },
919 
920     /** QZSS t<sub>oc</sub>. */
921     DF430 {
922         /** {@inheritDoc} */
923         @Override
924         public double doubleValue(final EncodedMessage message) {
925             return DataType.U_INT_16.decode(message).intValue() * 16.0;
926         }
927     },
928 
929     /** QZSS a<sub>f2</sub>. */
930     DF431 {
931         /** {@inheritDoc} */
932         @Override
933         public double doubleValue(final EncodedMessage message) {
934             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -55);
935         }
936     },
937 
938     /** QZSS a<sub>f1</sub>. */
939     DF432 {
940         /** {@inheritDoc} */
941         @Override
942         public double doubleValue(final EncodedMessage message) {
943             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43);
944         }
945     },
946 
947     /** QZSS a<sub>f0</sub>. */
948     DF433 {
949         /** {@inheritDoc} */
950         @Override
951         public double doubleValue(final EncodedMessage message) {
952             return FastMath.scalb(DataType.INT_22.decode(message).intValue(), -31);
953         }
954     },
955 
956     /** QZSS IODE. */
957     DF434 {
958         /** {@inheritDoc} */
959         @Override
960         public int intValue(final EncodedMessage message) {
961             return DataType.U_INT_8.decode(message).intValue();
962         }
963     },
964 
965     /** QZSS C<sub>rs</sub>. */
966     DF435 {
967         /** {@inheritDoc} */
968         @Override
969         public double doubleValue(final EncodedMessage message) {
970             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
971         }
972     },
973 
974     /** QZSS Δn. */
975     DF436 {
976         /** {@inheritDoc} */
977         @Override
978         public double doubleValue(final EncodedMessage message) {
979             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
980         }
981     },
982 
983     /** QZSS M<sub>0</sub>. */
984     DF437 {
985         /** {@inheritDoc} */
986         @Override
987         public double doubleValue(final EncodedMessage message) {
988             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
989         }
990     },
991 
992     /** QZSS C<sub>uc</sub>. */
993     DF438 {
994         /** {@inheritDoc} */
995         @Override
996         public double doubleValue(final EncodedMessage message) {
997             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
998         }
999     },
1000 
1001     /** QZSS e. */
1002     DF439 {
1003         /** {@inheritDoc} */
1004         @Override
1005         public double doubleValue(final EncodedMessage message) {
1006             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
1007         }
1008     },
1009 
1010     /** QZSS C<sub>us</sub>. */
1011     DF440 {
1012         /** {@inheritDoc} */
1013         @Override
1014         public double doubleValue(final EncodedMessage message) {
1015             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
1016         }
1017     },
1018 
1019     /** QZSS A<sup>1/2</sup>. */
1020     DF441 {
1021         /** {@inheritDoc} */
1022         @Override
1023         public double doubleValue(final EncodedMessage message) {
1024             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
1025         }
1026     },
1027 
1028     /** QZSS t<sub>oe</sub>. */
1029     DF442 {
1030         /** {@inheritDoc} */
1031         @Override
1032         public double doubleValue(final EncodedMessage message) {
1033             return DataType.U_INT_16.decode(message).intValue() * 16.0;
1034         }
1035     },
1036 
1037     /** QZSS C<sub>ic</sub>. */
1038     DF443 {
1039         /** {@inheritDoc} */
1040         @Override
1041         public double doubleValue(final EncodedMessage message) {
1042             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
1043         }
1044     },
1045 
1046     /** QZSS Ω<sub>0</sub>. */
1047     DF444 {
1048         /** {@inheritDoc} */
1049         @Override
1050         public double doubleValue(final EncodedMessage message) {
1051             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1052         }
1053     },
1054 
1055     /** QZSS C<sub>is</sub>. */
1056     DF445 {
1057         /** {@inheritDoc} */
1058         @Override
1059         public double doubleValue(final EncodedMessage message) {
1060             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
1061         }
1062     },
1063 
1064     /** QZSS i<sub>0</sub>. */
1065     DF446 {
1066         /** {@inheritDoc} */
1067         @Override
1068         public double doubleValue(final EncodedMessage message) {
1069             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1070         }
1071     },
1072 
1073     /** QZSS C<sub>rc</sub>. */
1074     DF447 {
1075         /** {@inheritDoc} */
1076         @Override
1077         public double doubleValue(final EncodedMessage message) {
1078             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
1079         }
1080     },
1081 
1082     /** QZSS ω. */
1083     DF448 {
1084         /** {@inheritDoc} */
1085         @Override
1086         public double doubleValue(final EncodedMessage message) {
1087             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1088         }
1089     },
1090 
1091     /** QZSS OMEGADOT (Rate of Right Ascension). */
1092     DF449 {
1093         /** {@inheritDoc} */
1094         @Override
1095         public double doubleValue(final EncodedMessage message) {
1096             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
1097         }
1098     },
1099 
1100     /** QZSS iDOT. */
1101     DF450 {
1102         /** {@inheritDoc} */
1103         @Override
1104         public double doubleValue(final EncodedMessage message) {
1105             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
1106         }
1107     },
1108 
1109     /** QZSS Codes on L2 Channel. */
1110     DF451 {
1111         /** {@inheritDoc} */
1112         @Override
1113         public int intValue(final EncodedMessage message) {
1114             return DataType.BIT_2.decode(message).intValue();
1115         }
1116     },
1117 
1118     /** QZSS Week Number. */
1119     DF452 {
1120         /** {@inheritDoc} */
1121         @Override
1122         public int intValue(final EncodedMessage message) {
1123             return DataType.U_INT_10.decode(message).intValue();
1124         }
1125     },
1126 
1127     /** QZSS URA Number. */
1128     DF453 {
1129         /** {@inheritDoc} */
1130         @Override
1131         public int intValue(final EncodedMessage message) {
1132             return DataType.U_INT_4.decode(message).intValue();
1133         }
1134     },
1135 
1136     /** QZSS SV health. */
1137     DF454 {
1138         /** {@inheritDoc} */
1139         @Override
1140         public int intValue(final EncodedMessage message) {
1141             return DataType.U_INT_6.decode(message).intValue();
1142         }
1143     },
1144 
1145     /** QZSS t<sub>GD</sub>. */
1146     DF455 {
1147         /** {@inheritDoc} */
1148         @Override
1149         public double doubleValue(final EncodedMessage message) {
1150             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -31);
1151         }
1152     },
1153 
1154     /** QZSS IODC. */
1155     DF456 {
1156         /** {@inheritDoc} */
1157         @Override
1158         public int intValue(final EncodedMessage message) {
1159             return DataType.U_INT_10.decode(message).intValue();
1160         }
1161     },
1162 
1163     /** QZSS Fit Interval. */
1164     DF457 {
1165         /** {@inheritDoc} */
1166         @Override
1167         public int intValue(final EncodedMessage message) {
1168             return DataType.BIT_1.decode(message).intValue();
1169         }
1170     },
1171 
1172     /** BDS Satellite ID. */
1173     DF488 {
1174         /** {@inheritDoc} */
1175         @Override
1176         public int intValue(final EncodedMessage message) {
1177             return DataType.U_INT_6.decode(message).intValue();
1178         }
1179     },
1180 
1181     /** BDS Week Number. */
1182     DF489 {
1183         /** {@inheritDoc} */
1184         @Override
1185         public int intValue(final EncodedMessage message) {
1186             return DataType.U_INT_13.decode(message).intValue();
1187         }
1188     },
1189 
1190     /** BDS SV URA Index. */
1191     DF490 {
1192         /** {@inheritDoc} */
1193         @Override
1194         public int intValue(final EncodedMessage message) {
1195             return DataType.BIT_4.decode(message).intValue();
1196         }
1197     },
1198 
1199     /** BDS IDOT. */
1200     DF491 {
1201         /** {@inheritDoc} */
1202         @Override
1203         public double doubleValue(final EncodedMessage message) {
1204             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
1205         }
1206     },
1207 
1208     /** BDS AODE. */
1209     DF492 {
1210         /** {@inheritDoc} */
1211         @Override
1212         public int intValue(final EncodedMessage message) {
1213             return DataType.U_INT_5.decode(message).intValue();
1214         }
1215     },
1216 
1217     /** BDS t<sub>oc</sub>. */
1218     DF493 {
1219         /** {@inheritDoc} */
1220         @Override
1221         public double doubleValue(final EncodedMessage message) {
1222             return DataType.U_INT_17.decode(message).intValue() * 8.0;
1223         }
1224     },
1225 
1226     /** BDS a<sub>f2</sub>. */
1227     DF494 {
1228         /** {@inheritDoc} */
1229         @Override
1230         public double doubleValue(final EncodedMessage message) {
1231             return FastMath.scalb(DataType.INT_11.decode(message).intValue(), -66);
1232         }
1233     },
1234 
1235     /** BDS a<sub>f1</sub>. */
1236     DF495 {
1237         /** {@inheritDoc} */
1238         @Override
1239         public double doubleValue(final EncodedMessage message) {
1240             return FastMath.scalb(DataType.INT_22.decode(message).intValue(), -50);
1241         }
1242     },
1243 
1244     /** BDS a<sub>f0</sub>. */
1245     DF496 {
1246         /** {@inheritDoc} */
1247         @Override
1248         public double doubleValue(final EncodedMessage message) {
1249             return FastMath.scalb(DataType.INT_24.decode(message).intValue(), -33);
1250         }
1251     },
1252 
1253     /** BDS AODC. */
1254     DF497 {
1255         /** {@inheritDoc} */
1256         @Override
1257         public int intValue(final EncodedMessage message) {
1258             return DataType.U_INT_5.decode(message).intValue();
1259         }
1260     },
1261 
1262     /** BDS C<sub>rs</sub>. */
1263     DF498 {
1264         /** {@inheritDoc} */
1265         @Override
1266         public double doubleValue(final EncodedMessage message) {
1267             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -6);
1268         }
1269     },
1270 
1271     /** BDS Δn. */
1272     DF499 {
1273         /** {@inheritDoc} */
1274         @Override
1275         public double doubleValue(final EncodedMessage message) {
1276             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
1277         }
1278     },
1279 
1280     /** BDS M<sub>0</sub>. */
1281     DF500 {
1282         /** {@inheritDoc} */
1283         @Override
1284         public double doubleValue(final EncodedMessage message) {
1285             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1286         }
1287     },
1288 
1289     /** BDS C<sub>uc</sub>. */
1290     DF501 {
1291         /** {@inheritDoc} */
1292         @Override
1293         public double doubleValue(final EncodedMessage message) {
1294             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
1295         }
1296     },
1297 
1298     /** BDS e. */
1299     DF502 {
1300         /** {@inheritDoc} */
1301         @Override
1302         public double doubleValue(final EncodedMessage message) {
1303             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
1304         }
1305     },
1306 
1307     /** BDS C<sub>us</sub>. */
1308     DF503 {
1309         /** {@inheritDoc} */
1310         @Override
1311         public double doubleValue(final EncodedMessage message) {
1312             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
1313         }
1314     },
1315 
1316     /** BDS a<sup>1/2</sup>. */
1317     DF504 {
1318         /** {@inheritDoc} */
1319         @Override
1320         public double doubleValue(final EncodedMessage message) {
1321             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
1322         }
1323     },
1324 
1325     /** BDS t<sub>oe</sub>. */
1326     DF505 {
1327         /** {@inheritDoc} */
1328         @Override
1329         public double doubleValue(final EncodedMessage message) {
1330             return DataType.U_INT_17.decode(message).intValue() * 8.0;
1331         }
1332     },
1333 
1334     /** BDS C<sub>ic</sub>. */
1335     DF506 {
1336         /** {@inheritDoc} */
1337         @Override
1338         public double doubleValue(final EncodedMessage message) {
1339             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
1340         }
1341     },
1342 
1343     /** BDS Ω<sub>0</sub>. */
1344     DF507 {
1345         /** {@inheritDoc} */
1346         @Override
1347         public double doubleValue(final EncodedMessage message) {
1348             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1349         }
1350     },
1351 
1352     /** BDS C<sub>is</sub>. */
1353     DF508 {
1354         /** {@inheritDoc} */
1355         @Override
1356         public double doubleValue(final EncodedMessage message) {
1357             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
1358         }
1359     },
1360 
1361     /** BDS i<sub>0</sub>. */
1362     DF509 {
1363         /** {@inheritDoc} */
1364         @Override
1365         public double doubleValue(final EncodedMessage message) {
1366             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1367         }
1368     },
1369 
1370     /** BDS C<sub>rc</sub>. */
1371     DF510 {
1372         /** {@inheritDoc} */
1373         @Override
1374         public double doubleValue(final EncodedMessage message) {
1375             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -6);
1376         }
1377     },
1378 
1379     /** BDS ω. */
1380     DF511 {
1381         /** {@inheritDoc} */
1382         @Override
1383         public double doubleValue(final EncodedMessage message) {
1384             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
1385         }
1386     },
1387 
1388     /** BDS OMEGADOT (Rate of Right Ascension). */
1389     DF512 {
1390         /** {@inheritDoc} */
1391         @Override
1392         public double doubleValue(final EncodedMessage message) {
1393             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
1394         }
1395     },
1396 
1397     /** BDS t<sub>GD1</sub>. */
1398     DF513 {
1399         /** {@inheritDoc} */
1400         @Override
1401         public double doubleValue(final EncodedMessage message) {
1402             return Units.NS.toSI(DataType.INT_10.decode(message).intValue() * 0.1);
1403         }
1404     },
1405 
1406     /** BDS t<sub>GD2</sub>. */
1407     DF514 {
1408         /** {@inheritDoc} */
1409         @Override
1410         public double doubleValue(final EncodedMessage message) {
1411             return Units.NS.toSI(DataType.INT_10.decode(message).intValue() * 0.1);
1412         }
1413     },
1414 
1415     /** BDS SV Health. */
1416     DF515 {
1417         /** {@inheritDoc} */
1418         @Override
1419         public int intValue(final EncodedMessage message) {
1420             return DataType.BIT_1.decode(message).intValue();
1421         }
1422     };
1423 
1424 }