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