RtcmDataField.java

  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. import java.util.Locale;

  19. import org.hipparchus.util.FastMath;
  20. import org.orekit.utils.units.Unit;

  21. /** Enum containing all intermediate level data fields that can be parsed
  22.  * to build a RTCM message.
  23.  * @author Bryan Cazabonne
  24.  * @since 11.0
  25.  */
  26. public enum RtcmDataField implements DataField {

  27.     /** RTCM Message number. */
  28.     DF002 {
  29.         /** {@inheritDoc} */
  30.         @Override
  31.         public String stringValue(final EncodedMessage message, final int n) {
  32.             return String.format(Locale.US, "%4s", DataType.U_INT_12.decode(message).intValue()).trim();
  33.         }
  34.     },

  35.     /** GPS Satellite ID. */
  36.     DF009 {
  37.         /** {@inheritDoc} */
  38.         @Override
  39.         public int intValue(final EncodedMessage message) {
  40.             return DataType.U_INT_6.decode(message).intValue();
  41.         }
  42.     },

  43.     /** GLONASS Satellite ID. */
  44.     DF038 {
  45.         /** {@inheritDoc} */
  46.         @Override
  47.         public int intValue(final EncodedMessage message) {
  48.             return DataType.U_INT_6.decode(message).intValue();
  49.         }
  50.     },

  51.     /** GLONASS Satellite Frequency Channel Number. */
  52.     DF040 {
  53.         /** {@inheritDoc} */
  54.         @Override
  55.         public int intValue(final EncodedMessage message) {
  56.             final int id = DataType.U_INT_5.decode(message).intValue();
  57.             return id - 7;
  58.         }
  59.     },

  60.     /** GNSS satellite ID. */
  61.     DF068 {
  62.         /** {@inheritDoc} */
  63.         @Override
  64.         public int intValue(final EncodedMessage message) {
  65.             return DataType.U_INT_6.decode(message).intValue();
  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.     /** GPS Week number. */
  77.     DF076 {
  78.         /** {@inheritDoc} */
  79.         @Override
  80.         public int intValue(final EncodedMessage message) {
  81.             return DataType.U_INT_10.decode(message).intValue();
  82.         }
  83.     },

  84.     /** GPS SV Accuracy. */
  85.     DF077 {
  86.         /** {@inheritDoc} */
  87.         @Override
  88.         public int intValue(final EncodedMessage message) {
  89.             return DataType.U_INT_4.decode(message).intValue();
  90.         }
  91.     },

  92.     /** GPS CODE ON L2. */
  93.     DF078 {
  94.         /** {@inheritDoc} */
  95.         @Override
  96.         public int intValue(final EncodedMessage message) {
  97.             return DataType.BIT_2.decode(message).intValue();
  98.         }
  99.     },

  100.     /** GPS Rate of Inclination Angle. */
  101.     DF079 {
  102.         /** {@inheritDoc} */
  103.         @Override
  104.         public double doubleValue(final EncodedMessage message) {
  105.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).doubleValue(), -43));
  106.         }
  107.     },

  108.     /** GPS toc. */
  109.     DF081 {
  110.         /** {@inheritDoc} */
  111.         @Override
  112.         public double doubleValue(final EncodedMessage message) {
  113.             return DataType.U_INT_16.decode(message).doubleValue() * 16.0;
  114.         }
  115.     },

  116.     /** GPS a<sub>f2</sub>. */
  117.     DF082 {
  118.         /** {@inheritDoc} */
  119.         @Override
  120.         public double doubleValue(final EncodedMessage message) {
  121.             return FastMath.scalb(DataType.INT_8.decode(message).doubleValue(), -55);
  122.         }
  123.     },

  124.     /** GPS a<sub>f1</sub>. */
  125.     DF083 {
  126.         /** {@inheritDoc} */
  127.         @Override
  128.         public double doubleValue(final EncodedMessage message) {
  129.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -43);
  130.         }
  131.     },

  132.     /** GPS a<sub>f0</sub>. */
  133.     DF084 {
  134.         /** {@inheritDoc} */
  135.         @Override
  136.         public double doubleValue(final EncodedMessage message) {
  137.             return FastMath.scalb(DataType.INT_22.decode(message).doubleValue(), -31);
  138.         }
  139.     },

  140.     /** GPS IODC (Issue Of Data, Clock). */
  141.     DF085 {
  142.         /** {@inheritDoc} */
  143.         @Override
  144.         public int intValue(final EncodedMessage message) {
  145.             return DataType.U_INT_10.decode(message).intValue();
  146.         }
  147.     },

  148.     /** GPS C<sub>rs</sub>. */
  149.     DF086 {
  150.         /** {@inheritDoc} */
  151.         @Override
  152.         public double doubleValue(final EncodedMessage message) {
  153.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -5);
  154.         }
  155.     },

  156.     /** GPS Δn (DELTA n). */
  157.     DF087 {
  158.         /** {@inheritDoc} */
  159.         @Override
  160.         public double doubleValue(final EncodedMessage message) {
  161.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -43));
  162.         }
  163.     },

  164.     /** GPS M<sub>0</sub>. */
  165.     DF088 {
  166.         /** {@inheritDoc} */
  167.         @Override
  168.         public double doubleValue(final EncodedMessage message) {
  169.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  170.         }
  171.     },

  172.     /** GPS C<sub>uc</sub>. */
  173.     DF089 {
  174.         /** {@inheritDoc} */
  175.         @Override
  176.         public double doubleValue(final EncodedMessage message) {
  177.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  178.         }
  179.     },

  180.     /** GPS Eccentricity (e). */
  181.     DF090 {
  182.         /** {@inheritDoc} */
  183.         @Override
  184.         public double doubleValue(final EncodedMessage message) {
  185.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  186.         }
  187.     },

  188.     /** GPS C<sub>us</sub>. */
  189.     DF091 {
  190.         /** {@inheritDoc} */
  191.         @Override
  192.         public double doubleValue(final EncodedMessage message) {
  193.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  194.         }
  195.     },

  196.     /** GPS A<sup>1/2</sup>. */
  197.     DF092 {
  198.         /** {@inheritDoc} */
  199.         @Override
  200.         public double doubleValue(final EncodedMessage message) {
  201.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  202.         }
  203.     },

  204.     /** GPS t<sub>oe</sub>. */
  205.     DF093 {
  206.         /** {@inheritDoc} */
  207.         @Override
  208.         public double doubleValue(final EncodedMessage message) {
  209.             return DataType.U_INT_16.decode(message).doubleValue() * 16.0;
  210.         }
  211.     },

  212.     /** GPS C<sub>ic</sub>. */
  213.     DF094 {
  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.     /** GPS Ω<sub>0</sub> (OMEGA)<sub>0</sub>. */
  221.     DF095 {
  222.         /** {@inheritDoc} */
  223.         @Override
  224.         public double doubleValue(final EncodedMessage message) {
  225.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  226.         }
  227.     },

  228.     /** GPS C<sub>is</sub>. */
  229.     DF096 {
  230.         /** {@inheritDoc} */
  231.         @Override
  232.         public double doubleValue(final EncodedMessage message) {
  233.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  234.         }
  235.     },

  236.     /** GPS i<sub>0</sub>. */
  237.     DF097 {
  238.         /** {@inheritDoc} */
  239.         @Override
  240.         public double doubleValue(final EncodedMessage message) {
  241.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  242.         }
  243.     },

  244.     /** GPS C<sub>rc</sub>. */
  245.     DF098 {
  246.         /** {@inheritDoc} */
  247.         @Override
  248.         public double doubleValue(final EncodedMessage message) {
  249.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -5);
  250.         }
  251.     },

  252.     /** GPS ω (Argument of Perigee). */
  253.     DF099 {
  254.         /** {@inheritDoc} */
  255.         @Override
  256.         public double doubleValue(final EncodedMessage message) {
  257.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  258.         }
  259.     },

  260.     /** GPS OMEGADOT (Rate of Right Ascension). */
  261.     DF100 {
  262.         /** {@inheritDoc} */
  263.         @Override
  264.         public double doubleValue(final EncodedMessage message) {
  265.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).doubleValue(), -43));
  266.         }
  267.     },

  268.     /** GPS t<sub>GD</sub>. */
  269.     DF101 {
  270.         /** {@inheritDoc} */
  271.         @Override
  272.         public double doubleValue(final EncodedMessage message) {
  273.             return FastMath.scalb(DataType.INT_8.decode(message).doubleValue(), -31);
  274.         }
  275.     },

  276.     /** GPS SV HEALTH. */
  277.     DF102 {
  278.         /** {@inheritDoc} */
  279.         @Override
  280.         public int intValue(final EncodedMessage message) {
  281.             return DataType.U_INT_6.decode(message).intValue();
  282.         }
  283.     },

  284.     /** GPS L2 P data flag. */
  285.     DF103 {
  286.         /** {@inheritDoc} */
  287.         @Override
  288.         public boolean booleanValue(final EncodedMessage message) {
  289.             return DataType.BIT_1.decode(message) == 0;
  290.         }
  291.     },

  292.     /** GLONASS almanac health (C<sub>n</sub> word). */
  293.     DF104 {
  294.         /** {@inheritDoc} */
  295.         @Override
  296.         public int intValue(final EncodedMessage message) {
  297.             return DataType.BIT_1.decode(message).intValue();
  298.         }
  299.     },

  300.     /** GLONASS almanac health availability indicator. */
  301.     DF105 {
  302.         /** {@inheritDoc} */
  303.         @Override
  304.         public boolean booleanValue(final EncodedMessage message) {
  305.             return DataType.BIT_1.decode(message) > 0;
  306.         }
  307.     },

  308.     /** GLONASS P1. */
  309.     DF106 {
  310.         /** {@inheritDoc} */
  311.         @Override
  312.         public int intValue(final EncodedMessage message) {
  313.             // Word P1 indicates a time interval (in sec) between two adjacent values of tb parameter
  314.             switch (DataType.BIT_2.decode(message).intValue()) {
  315.                 case 0  : return 0;
  316.                 case 1  : return 1800;
  317.                 case 2  : return 2700;
  318.                 default : return 3600;
  319.             }
  320.         }
  321.     },

  322.     /** GLONASS t<sub>k</sub> (s). */
  323.     DF107 {
  324.         /** {@inheritDoc} */
  325.         @Override
  326.         public double doubleValue(final EncodedMessage message) {
  327.             final int    hours    = DataType.U_INT_5.decode(message).intValue();
  328.             final int    minutes  = DataType.U_INT_6.decode(message).intValue();
  329.             final double secondes = DataType.BIT_1.decode(message).doubleValue() * 30.0;
  330.             return hours * 3600.0 + minutes * 60.0 + secondes;
  331.         }
  332.     },

  333.     /** GLONASS MSB of B<sub>n</sub> word. */
  334.     DF108 {
  335.         /** {@inheritDoc} */
  336.         @Override
  337.         public int intValue(final EncodedMessage message) {
  338.             return DataType.BIT_1.decode(message).intValue();
  339.         }
  340.     },

  341.     /** GLONASS P2 Flag. */
  342.     DF109 {
  343.         /** {@inheritDoc} */
  344.         @Override
  345.         public int intValue(final EncodedMessage message) {
  346.             return DataType.BIT_1.decode(message).intValue();
  347.         }
  348.     },

  349.     /** GLONASS t<sub>b</sub>. */
  350.     DF110 {
  351.         /** {@inheritDoc} */
  352.         @Override
  353.         public double doubleValue(final EncodedMessage message) {
  354.             return Unit.MINUTE.toSI(DataType.U_INT_7.decode(message).doubleValue() * 15.0);
  355.         }
  356.     },

  357.     /** GLONASS x<sub>n</sub> (t<sub>b</sub>), first derivative. */
  358.     DF111 {
  359.         /** {@inheritDoc} */
  360.         @Override
  361.         public double doubleValue(final EncodedMessage message) {
  362.             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).doubleValue(), -20));
  363.         }
  364.     },

  365.     /** GLONASS x<sub>n</sub> (t<sub>b</sub>). */
  366.     DF112 {
  367.         /** {@inheritDoc} */
  368.         @Override
  369.         public double doubleValue(final EncodedMessage message) {
  370.             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).doubleValue(), -11));
  371.         }
  372.     },

  373.     /** GLONASS x<sub>n</sub> (t<sub>b</sub>), second derivative. */
  374.     DF113 {
  375.         /** {@inheritDoc} */
  376.         @Override
  377.         public double doubleValue(final EncodedMessage message) {
  378.             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).doubleValue(), -30));
  379.         }
  380.     },

  381.     /** GLONASS y<sub>n</sub> (t<sub>b</sub>), first derivative. */
  382.     DF114 {
  383.         /** {@inheritDoc} */
  384.         @Override
  385.         public double doubleValue(final EncodedMessage message) {
  386.             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).doubleValue(), -20));
  387.         }
  388.     },

  389.     /** GLONASS y<sub>n</sub> (t<sub>b</sub>). */
  390.     DF115 {
  391.         /** {@inheritDoc} */
  392.         @Override
  393.         public double doubleValue(final EncodedMessage message) {
  394.             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).doubleValue(), -11));
  395.         }
  396.     },

  397.     /** GLONASS y<sub>n</sub> (t<sub>b</sub>), second derivative. */
  398.     DF116 {
  399.         /** {@inheritDoc} */
  400.         @Override
  401.         public double doubleValue(final EncodedMessage message) {
  402.             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).doubleValue(), -30));
  403.         }
  404.     },

  405.     /** GLONASS z<sub>n</sub> (t<sub>b</sub>), first derivative. */
  406.     DF117 {
  407.         /** {@inheritDoc} */
  408.         @Override
  409.         public double doubleValue(final EncodedMessage message) {
  410.             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).doubleValue(), -20));
  411.         }
  412.     },

  413.     /** GLONASS z<sub>n</sub> (t<sub>b</sub>). */
  414.     DF118 {
  415.         /** {@inheritDoc} */
  416.         @Override
  417.         public double doubleValue(final EncodedMessage message) {
  418.             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).doubleValue(), -11));
  419.         }
  420.     },

  421.     /** GLONASS z<sub>n</sub> (t<sub>b</sub>), second derivative. */
  422.     DF119 {
  423.         /** {@inheritDoc} */
  424.         @Override
  425.         public double doubleValue(final EncodedMessage message) {
  426.             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).doubleValue(), -30));
  427.         }
  428.     },

  429.     /** GLONASS P3 Flag. */
  430.     DF120 {
  431.         /** {@inheritDoc} */
  432.         @Override
  433.         public int intValue(final EncodedMessage message) {
  434.             // Flag indicating a number of satellites for which almanac is transmitted within given frame
  435.             if (DataType.BIT_1.decode(message) == 0) {
  436.                 return 4;
  437.             } else {
  438.                 return 5;
  439.             }
  440.         }
  441.     },

  442.     /** GLONASS γ<sub>n</sub> (t<sub>b</sub>). */
  443.     DF121 {
  444.         /** {@inheritDoc} */
  445.         @Override
  446.         public double doubleValue(final EncodedMessage message) {
  447.             return FastMath.scalb(DataType.INT_S_11.decode(message).doubleValue(), -40);
  448.         }
  449.     },

  450.     /** GLONASS-M P. */
  451.     DF122 {
  452.         /** {@inheritDoc} */
  453.         @Override
  454.         public int intValue(final EncodedMessage message) {
  455.             return DataType.BIT_2.decode(message).intValue();
  456.         }
  457.     },

  458.     /** GLONASS-M l<sub>n</sub> (third string). */
  459.     DF123 {
  460.         /** {@inheritDoc} */
  461.         @Override
  462.         public int intValue(final EncodedMessage message) {
  463.             return DataType.BIT_1.decode(message).intValue();
  464.         }
  465.     },

  466.     /** GLONASS τ<sub>n</sub> (t<sub>b</sub>). */
  467.     DF124 {
  468.         /** {@inheritDoc} */
  469.         @Override
  470.         public double doubleValue(final EncodedMessage message) {
  471.             return FastMath.scalb(DataType.INT_S_22.decode(message).doubleValue(), -30);
  472.         }
  473.     },

  474.     /** GLONASS Δτ<sub>n</sub>. */
  475.     DF125 {
  476.         /** {@inheritDoc} */
  477.         @Override
  478.         public double doubleValue(final EncodedMessage message) {
  479.             return FastMath.scalb(DataType.INT_S_5.decode(message).doubleValue(), -30);
  480.         }
  481.     },

  482.     /** GLONASS E<sub>n</sub>. */
  483.     DF126 {
  484.         /** {@inheritDoc} */
  485.         @Override
  486.         public int intValue(final EncodedMessage message) {
  487.             return DataType.U_INT_5.decode(message).intValue();
  488.         }
  489.     },

  490.     /** GLONASS-M P4. */
  491.     DF127 {
  492.         /** {@inheritDoc} */
  493.         @Override
  494.         public int intValue(final EncodedMessage message) {
  495.             return DataType.BIT_1.decode(message).intValue();
  496.         }
  497.     },

  498.     /** GLONASS-M F<sub>T</sub>. */
  499.     DF128 {
  500.         /** {@inheritDoc} */
  501.         @Override
  502.         public int intValue(final EncodedMessage message) {
  503.             return DataType.U_INT_4.decode(message).intValue();
  504.         }
  505.     },

  506.     /** GLONASS-M N<sub>T</sub>. */
  507.     DF129 {
  508.         /** {@inheritDoc} */
  509.         @Override
  510.         public int intValue(final EncodedMessage message) {
  511.             return DataType.U_INT_11.decode(message).intValue();
  512.         }
  513.     },

  514.     /** GLONASS-M M. */
  515.     DF130 {
  516.         /** {@inheritDoc} */
  517.         @Override
  518.         public int intValue(final EncodedMessage message) {
  519.             return DataType.BIT_2.decode(message).intValue();
  520.         }
  521.     },

  522.     /** GLONASS The Availability of Additional Data. */
  523.     DF131 {
  524.         /** {@inheritDoc} */
  525.         @Override
  526.         public boolean booleanValue(final EncodedMessage message) {
  527.             return DataType.BIT_1.decode(message) > 0;
  528.         }
  529.     },

  530.     /** GLONASS N<sup>A</sup>. */
  531.     DF132 {
  532.         /** {@inheritDoc} */
  533.         @Override
  534.         public int intValue(final EncodedMessage message) {
  535.             return DataType.U_INT_11.decode(message).intValue();
  536.         }
  537.     },

  538.     /** GLONASS τ<sub>c</sub>. */
  539.     DF133 {
  540.         /** {@inheritDoc} */
  541.         @Override
  542.         public double doubleValue(final EncodedMessage message) {
  543.             return FastMath.scalb(DataType.INT_S_32.decode(message).doubleValue(), -31);
  544.         }
  545.     },

  546.     /** GLONASS-M N<sub>4</sub>. */
  547.     DF134 {
  548.         /** {@inheritDoc} */
  549.         @Override
  550.         public int intValue(final EncodedMessage message) {
  551.             return DataType.U_INT_5.decode(message).intValue();
  552.         }
  553.     },

  554.     /** GLONASS τ<sub>GPS</sub>. */
  555.     DF135 {
  556.         /** {@inheritDoc} */
  557.         @Override
  558.         public double doubleValue(final EncodedMessage message) {
  559.             return FastMath.scalb(DataType.INT_S_22.decode(message).doubleValue(), -31);
  560.         }
  561.     },

  562.     /** GLONASS-M l<sub>n</sub> (fifth string). */
  563.     DF136 {
  564.         /** {@inheritDoc} */
  565.         @Override
  566.         public int intValue(final EncodedMessage message) {
  567.             return DataType.BIT_1.decode(message).intValue();
  568.         }
  569.     },

  570.     /** GPS Fit Interval. */
  571.     DF137 {
  572.         /** {@inheritDoc} */
  573.         @Override
  574.         public int intValue(final EncodedMessage message) {
  575.             return DataType.BIT_1.decode(message).intValue();
  576.         }
  577.     },

  578.     /** Galileo Satellite ID. */
  579.     DF252 {
  580.         /** {@inheritDoc} */
  581.         @Override
  582.         public int intValue(final EncodedMessage message) {
  583.             return DataType.U_INT_6.decode(message).intValue();
  584.         }
  585.     },

  586.     /** Galileo Week Number (WN). */
  587.     DF289 {
  588.         /** {@inheritDoc} */
  589.         @Override
  590.         public int intValue(final EncodedMessage message) {
  591.             return DataType.U_INT_12.decode(message).intValue();
  592.         }
  593.     },

  594.     /** Galileo IODnav. */
  595.     DF290 {
  596.         /** {@inheritDoc} */
  597.         @Override
  598.         public int intValue(final EncodedMessage message) {
  599.             return DataType.U_INT_10.decode(message).intValue();
  600.         }
  601.     },

  602.     /** Galileo SV SISA. */
  603.     DF291 {
  604.         /** {@inheritDoc} */
  605.         @Override
  606.         public int intValue(final EncodedMessage message) {
  607.             return DataType.BIT_8.decode(message).intValue();
  608.         }
  609.     },

  610.     /** Galileo IDOT. */
  611.     DF292 {
  612.         /** {@inheritDoc} */
  613.         @Override
  614.         public double doubleValue(final EncodedMessage message) {
  615.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).doubleValue(), -43));
  616.         }
  617.     },

  618.     /** Galileo t<sub>oc</sub>. */
  619.     DF293 {
  620.         /** {@inheritDoc} */
  621.         @Override
  622.         public double doubleValue(final EncodedMessage message) {
  623.             return DataType.U_INT_14.decode(message).doubleValue() * 60.0;
  624.         }
  625.     },

  626.     /** Galileo a<sub>f2</sub>. */
  627.     DF294 {
  628.         /** {@inheritDoc} */
  629.         @Override
  630.         public double doubleValue(final EncodedMessage message) {
  631.             return FastMath.scalb(DataType.INT_6.decode(message).doubleValue(), -59);
  632.         }
  633.     },

  634.     /** Galileo a<sub>f1</sub>. */
  635.     DF295 {
  636.         /** {@inheritDoc} */
  637.         @Override
  638.         public double doubleValue(final EncodedMessage message) {
  639.             return FastMath.scalb(DataType.INT_21.decode(message).doubleValue(), -46);
  640.         }
  641.     },

  642.     /** Galileo a<sub>f0</sub>. */
  643.     DF296 {
  644.         /** {@inheritDoc} */
  645.         @Override
  646.         public double doubleValue(final EncodedMessage message) {
  647.             return FastMath.scalb(DataType.INT_31.decode(message).doubleValue(), -34);
  648.         }
  649.     },

  650.     /** Galileo C<sub>rs</sub>. */
  651.     DF297 {
  652.         /** {@inheritDoc} */
  653.         @Override
  654.         public double doubleValue(final EncodedMessage message) {
  655.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -5);
  656.         }
  657.     },

  658.     /** Galileo Δn. */
  659.     DF298 {
  660.         /** {@inheritDoc} */
  661.         @Override
  662.         public double doubleValue(final EncodedMessage message) {
  663.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -43));
  664.         }
  665.     },

  666.     /** Galileo M<sub>0</sub>. */
  667.     DF299 {
  668.         /** {@inheritDoc} */
  669.         @Override
  670.         public double doubleValue(final EncodedMessage message) {
  671.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  672.         }
  673.     },

  674.     /** Galileo C<sub>uc</sub>. */
  675.     DF300 {
  676.         /** {@inheritDoc} */
  677.         @Override
  678.         public double doubleValue(final EncodedMessage message) {
  679.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  680.         }
  681.     },

  682.     /** Galileo e. */
  683.     DF301 {
  684.         /** {@inheritDoc} */
  685.         @Override
  686.         public double doubleValue(final EncodedMessage message) {
  687.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  688.         }
  689.     },

  690.     /** Galileo C<sub>us</sub>. */
  691.     DF302 {
  692.         /** {@inheritDoc} */
  693.         @Override
  694.         public double doubleValue(final EncodedMessage message) {
  695.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  696.         }
  697.     },

  698.     /** Galileo A<sup>1/2</sup>. */
  699.     DF303 {
  700.         /** {@inheritDoc} */
  701.         @Override
  702.         public double doubleValue(final EncodedMessage message) {
  703.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  704.         }
  705.     },

  706.     /** Galileo t<sub>oe</sub>. */
  707.     DF304 {
  708.         /** {@inheritDoc} */
  709.         @Override
  710.         public double doubleValue(final EncodedMessage message) {
  711.             return DataType.U_INT_14.decode(message).doubleValue() * 60.0;
  712.         }
  713.     },

  714.     /** Galileo C<sub>ic</sub>. */
  715.     DF305 {
  716.         /** {@inheritDoc} */
  717.         @Override
  718.         public double doubleValue(final EncodedMessage message) {
  719.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  720.         }
  721.     },

  722.     /** Galileo Ω<sub>0</sub>. */
  723.     DF306 {
  724.         /** {@inheritDoc} */
  725.         @Override
  726.         public double doubleValue(final EncodedMessage message) {
  727.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  728.         }
  729.     },

  730.     /** Galileo C<sub>is</sub>. */
  731.     DF307 {
  732.         /** {@inheritDoc} */
  733.         @Override
  734.         public double doubleValue(final EncodedMessage message) {
  735.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  736.         }
  737.     },

  738.     /** Galileo i<sub>0</sub>. */
  739.     DF308 {
  740.         /** {@inheritDoc} */
  741.         @Override
  742.         public double doubleValue(final EncodedMessage message) {
  743.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  744.         }
  745.     },

  746.     /** Galileo C<sub>rc</sub>. */
  747.     DF309 {
  748.         /** {@inheritDoc} */
  749.         @Override
  750.         public double doubleValue(final EncodedMessage message) {
  751.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -5);
  752.         }
  753.     },

  754.     /** Galileo ω. */
  755.     DF310 {
  756.         /** {@inheritDoc} */
  757.         @Override
  758.         public double doubleValue(final EncodedMessage message) {
  759.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  760.         }
  761.     },

  762.     /** Galileo OMEGADOT (Rate of Right Ascension). */
  763.     DF311 {
  764.         /** {@inheritDoc} */
  765.         @Override
  766.         public double doubleValue(final EncodedMessage message) {
  767.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).doubleValue(), -43));
  768.         }
  769.     },

  770.     /** Galileo BGD (E1/E5a). */
  771.     DF312 {
  772.         /** {@inheritDoc} */
  773.         @Override
  774.         public double doubleValue(final EncodedMessage message) {
  775.             return FastMath.scalb(DataType.INT_10.decode(message).doubleValue(), -32);
  776.         }
  777.     },

  778.     /** Galileo BGD (E5b/E1). */
  779.     DF313 {
  780.         /** {@inheritDoc} */
  781.         @Override
  782.         public double doubleValue(final EncodedMessage message) {
  783.             return FastMath.scalb(DataType.INT_10.decode(message).doubleValue(), -32);
  784.         }
  785.     },

  786.     /** E5a SIGNAL Health Status. */
  787.     DF314 {
  788.         /** {@inheritDoc} */
  789.         @Override
  790.         public int intValue(final EncodedMessage message) {
  791.             return DataType.BIT_2.decode(message).intValue();
  792.         }
  793.     },

  794.     /** E5a Data Validity Status. */
  795.     DF315 {
  796.         /** {@inheritDoc} */
  797.         @Override
  798.         public int intValue(final EncodedMessage message) {
  799.             return DataType.BIT_1.decode(message).intValue();
  800.         }
  801.     },

  802.     /** Galileo SOL NAV Signal Health Status (SOLHS). */
  803.     DF316 {
  804.         /** {@inheritDoc} */
  805.         @Override
  806.         public int intValue(final EncodedMessage message) {
  807.             return DataType.BIT_2.decode(message).intValue();
  808.         }
  809.     },

  810.     /** Galileo SOL NAV Data Validity Status (SOLDVS). */
  811.     DF317 {
  812.         /** {@inheritDoc} */
  813.         @Override
  814.         public int intValue(final EncodedMessage message) {
  815.             return DataType.BIT_1.decode(message).intValue();
  816.         }
  817.     },

  818.     /** Delta Orbit Radial (m). */
  819.     DF365 {
  820.         /** {@inheritDoc} */
  821.         @Override
  822.         public double doubleValue(final EncodedMessage message) {
  823.             return Units.MM.toSI(DataType.INT_22.decode(message).doubleValue() * 0.1);
  824.         }
  825.     },

  826.     /** Delta Along-Track (m). */
  827.     DF366 {
  828.         /** {@inheritDoc} */
  829.         @Override
  830.         public double doubleValue(final EncodedMessage message) {
  831.             return Units.MM.toSI(DataType.INT_20.decode(message).doubleValue() * 0.4);
  832.         }
  833.     },

  834.     /** Delta Cross-Track (m). */
  835.     DF367 {
  836.         /** {@inheritDoc} */
  837.         @Override
  838.         public double doubleValue(final EncodedMessage message) {
  839.             return Units.MM.toSI(DataType.INT_20.decode(message).doubleValue() * 0.4);
  840.         }
  841.     },

  842.     /** Dot Delta Radial (m/s). */
  843.     DF368 {
  844.         /** {@inheritDoc} */
  845.         @Override
  846.         public double doubleValue(final EncodedMessage message) {
  847.             return Units.MM_PER_S.toSI(DataType.INT_21.decode(message).doubleValue() * 0.001);
  848.         }
  849.     },

  850.     /** Dot Delta Along-Track (m/s). */
  851.     DF369 {
  852.         /** {@inheritDoc} */
  853.         @Override
  854.         public double doubleValue(final EncodedMessage message) {
  855.             return Units.MM_PER_S.toSI(DataType.INT_19.decode(message).doubleValue() * 0.004);
  856.         }
  857.     },

  858.     /** Dot Delta Cross-Track (m/s). */
  859.     DF370 {
  860.         /** {@inheritDoc} */
  861.         @Override
  862.         public double doubleValue(final EncodedMessage message) {
  863.             return Units.MM_PER_S.toSI(DataType.INT_19.decode(message).doubleValue() * 0.004);
  864.         }
  865.     },

  866.     /** Satellite Reference Datum. */
  867.     DF375 {
  868.         /** {@inheritDoc} */
  869.         @Override
  870.         public int intValue(final EncodedMessage message) {
  871.             return DataType.BIT_1.decode(message).byteValue();
  872.         }
  873.     },

  874.     /** Delta Clock C0. */
  875.     DF376 {
  876.         /** {@inheritDoc} */
  877.         @Override
  878.         public double doubleValue(final EncodedMessage message) {
  879.             return Units.MM.toSI(DataType.INT_22.decode(message).doubleValue() * 0.1);
  880.         }
  881.     },

  882.     /** Delta Clock C1. */
  883.     DF377 {
  884.         /** {@inheritDoc} */
  885.         @Override
  886.         public double doubleValue(final EncodedMessage message) {
  887.             return Units.MM_PER_S.toSI(DataType.INT_21.decode(message).doubleValue() * 0.001);
  888.         }
  889.     },

  890.     /** Delta Clock C2. */
  891.     DF378 {
  892.         /** {@inheritDoc} */
  893.         @Override
  894.         public double doubleValue(final EncodedMessage message) {
  895.             return Units.MM_PER_S2.toSI(DataType.INT_27.decode(message).doubleValue() * 0.00002);
  896.         }
  897.     },

  898.     /** GLONASS Satellite ID. */
  899.     DF384 {
  900.         /** {@inheritDoc} */
  901.         @Override
  902.         public int intValue(final EncodedMessage message) {
  903.             return DataType.U_INT_5.decode(message).byteValue();
  904.         }
  905.     },

  906.     /** GPS Epoch Time 1s. */
  907.     DF385 {
  908.         /** {@inheritDoc} */
  909.         @Override
  910.         public int intValue(final EncodedMessage message) {
  911.             return DataType.U_INT_20.decode(message).intValue();
  912.         }
  913.     },

  914.     /** GLONASS Epoch Time 1s. */
  915.     DF386 {
  916.         /** {@inheritDoc} */
  917.         @Override
  918.         public int intValue(final EncodedMessage message) {
  919.             return DataType.U_INT_17.decode(message).intValue();
  920.         }
  921.     },

  922.     /** No. of Satellites. */
  923.     DF387 {
  924.         /** {@inheritDoc} */
  925.         @Override
  926.         public int intValue(final EncodedMessage message) {
  927.             return DataType.U_INT_6.decode(message).byteValue();
  928.         }
  929.     },

  930.     /** Multiple Message Indicator. */
  931.     DF388 {
  932.         /** {@inheritDoc} */
  933.         @Override
  934.         public int intValue(final EncodedMessage message) {
  935.             return DataType.BIT_1.decode(message).byteValue();
  936.         }
  937.     },

  938.     /** SSR Update Interval. */
  939.     DF391 {
  940.         /** {@inheritDoc} */
  941.         @Override
  942.         public int intValue(final EncodedMessage message) {
  943.             return DataType.BIT_4.decode(message).byteValue();
  944.         }
  945.     },

  946.     /** GLONASS Issue Of Date (IOD). */
  947.     DF392 {
  948.         /** {@inheritDoc} */
  949.         @Override
  950.         public int intValue(final EncodedMessage message) {
  951.             return DataType.BIT_8.decode(message).intValue();
  952.         }
  953.     },

  954.     /** IOD SSR. */
  955.     DF413 {
  956.         /** {@inheritDoc} */
  957.         @Override
  958.         public int intValue(final EncodedMessage message) {
  959.             return DataType.U_INT_4.decode(message).byteValue();
  960.         }
  961.     },

  962.     /** SSR Provider ID. */
  963.     DF414 {
  964.         /** {@inheritDoc} */
  965.         @Override
  966.         public int intValue(final EncodedMessage message) {
  967.             return DataType.U_INT_16.decode(message).intValue();
  968.         }
  969.     },

  970.     /** SSR Solution ID. */
  971.     DF415 {
  972.         /** {@inheritDoc} */
  973.         @Override
  974.         public int intValue(final EncodedMessage message) {
  975.             return DataType.U_INT_4.decode(message).byteValue();
  976.         }
  977.     },

  978.     /** QZSS Satellite ID. */
  979.     DF429 {
  980.         /** {@inheritDoc} */
  981.         @Override
  982.         public int intValue(final EncodedMessage message) {
  983.             // 1 refers to satellite 193, 2 refers to satellite 194, etc.
  984.             return DataType.U_INT_4.decode(message).intValue() + 192;
  985.         }
  986.     },

  987.     /** QZSS t<sub>oc</sub>. */
  988.     DF430 {
  989.         /** {@inheritDoc} */
  990.         @Override
  991.         public double doubleValue(final EncodedMessage message) {
  992.             return DataType.U_INT_16.decode(message).doubleValue() * 16.0;
  993.         }
  994.     },

  995.     /** QZSS a<sub>f2</sub>. */
  996.     DF431 {
  997.         /** {@inheritDoc} */
  998.         @Override
  999.         public double doubleValue(final EncodedMessage message) {
  1000.             return FastMath.scalb(DataType.INT_8.decode(message).doubleValue(), -55);
  1001.         }
  1002.     },

  1003.     /** QZSS a<sub>f1</sub>. */
  1004.     DF432 {
  1005.         /** {@inheritDoc} */
  1006.         @Override
  1007.         public double doubleValue(final EncodedMessage message) {
  1008.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -43);
  1009.         }
  1010.     },

  1011.     /** QZSS a<sub>f0</sub>. */
  1012.     DF433 {
  1013.         /** {@inheritDoc} */
  1014.         @Override
  1015.         public double doubleValue(final EncodedMessage message) {
  1016.             return FastMath.scalb(DataType.INT_22.decode(message).doubleValue(), -31);
  1017.         }
  1018.     },

  1019.     /** QZSS IODE. */
  1020.     DF434 {
  1021.         /** {@inheritDoc} */
  1022.         @Override
  1023.         public int intValue(final EncodedMessage message) {
  1024.             return DataType.U_INT_8.decode(message).intValue();
  1025.         }
  1026.     },

  1027.     /** QZSS C<sub>rs</sub>. */
  1028.     DF435 {
  1029.         /** {@inheritDoc} */
  1030.         @Override
  1031.         public double doubleValue(final EncodedMessage message) {
  1032.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -5);
  1033.         }
  1034.     },

  1035.     /** QZSS Δn. */
  1036.     DF436 {
  1037.         /** {@inheritDoc} */
  1038.         @Override
  1039.         public double doubleValue(final EncodedMessage message) {
  1040.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -43));
  1041.         }
  1042.     },

  1043.     /** QZSS M<sub>0</sub>. */
  1044.     DF437 {
  1045.         /** {@inheritDoc} */
  1046.         @Override
  1047.         public double doubleValue(final EncodedMessage message) {
  1048.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1049.         }
  1050.     },

  1051.     /** QZSS C<sub>uc</sub>. */
  1052.     DF438 {
  1053.         /** {@inheritDoc} */
  1054.         @Override
  1055.         public double doubleValue(final EncodedMessage message) {
  1056.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  1057.         }
  1058.     },

  1059.     /** QZSS e. */
  1060.     DF439 {
  1061.         /** {@inheritDoc} */
  1062.         @Override
  1063.         public double doubleValue(final EncodedMessage message) {
  1064.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  1065.         }
  1066.     },

  1067.     /** QZSS C<sub>us</sub>. */
  1068.     DF440 {
  1069.         /** {@inheritDoc} */
  1070.         @Override
  1071.         public double doubleValue(final EncodedMessage message) {
  1072.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  1073.         }
  1074.     },

  1075.     /** QZSS A<sup>1/2</sup>. */
  1076.     DF441 {
  1077.         /** {@inheritDoc} */
  1078.         @Override
  1079.         public double doubleValue(final EncodedMessage message) {
  1080.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  1081.         }
  1082.     },

  1083.     /** QZSS t<sub>oe</sub>. */
  1084.     DF442 {
  1085.         /** {@inheritDoc} */
  1086.         @Override
  1087.         public double doubleValue(final EncodedMessage message) {
  1088.             return DataType.U_INT_16.decode(message).doubleValue() * 16.0;
  1089.         }
  1090.     },

  1091.     /** QZSS C<sub>ic</sub>. */
  1092.     DF443 {
  1093.         /** {@inheritDoc} */
  1094.         @Override
  1095.         public double doubleValue(final EncodedMessage message) {
  1096.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  1097.         }
  1098.     },

  1099.     /** QZSS Ω<sub>0</sub>. */
  1100.     DF444 {
  1101.         /** {@inheritDoc} */
  1102.         @Override
  1103.         public double doubleValue(final EncodedMessage message) {
  1104.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1105.         }
  1106.     },

  1107.     /** QZSS C<sub>is</sub>. */
  1108.     DF445 {
  1109.         /** {@inheritDoc} */
  1110.         @Override
  1111.         public double doubleValue(final EncodedMessage message) {
  1112.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -29);
  1113.         }
  1114.     },

  1115.     /** QZSS i<sub>0</sub>. */
  1116.     DF446 {
  1117.         /** {@inheritDoc} */
  1118.         @Override
  1119.         public double doubleValue(final EncodedMessage message) {
  1120.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1121.         }
  1122.     },

  1123.     /** QZSS C<sub>rc</sub>. */
  1124.     DF447 {
  1125.         /** {@inheritDoc} */
  1126.         @Override
  1127.         public double doubleValue(final EncodedMessage message) {
  1128.             return FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -5);
  1129.         }
  1130.     },

  1131.     /** QZSS ω. */
  1132.     DF448 {
  1133.         /** {@inheritDoc} */
  1134.         @Override
  1135.         public double doubleValue(final EncodedMessage message) {
  1136.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1137.         }
  1138.     },

  1139.     /** QZSS OMEGADOT (Rate of Right Ascension). */
  1140.     DF449 {
  1141.         /** {@inheritDoc} */
  1142.         @Override
  1143.         public double doubleValue(final EncodedMessage message) {
  1144.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).doubleValue(), -43));
  1145.         }
  1146.     },

  1147.     /** QZSS iDOT. */
  1148.     DF450 {
  1149.         /** {@inheritDoc} */
  1150.         @Override
  1151.         public double doubleValue(final EncodedMessage message) {
  1152.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).doubleValue(), -43));
  1153.         }
  1154.     },

  1155.     /** QZSS Codes on L2 Channel. */
  1156.     DF451 {
  1157.         /** {@inheritDoc} */
  1158.         @Override
  1159.         public int intValue(final EncodedMessage message) {
  1160.             return DataType.BIT_2.decode(message).intValue();
  1161.         }
  1162.     },

  1163.     /** QZSS Week Number. */
  1164.     DF452 {
  1165.         /** {@inheritDoc} */
  1166.         @Override
  1167.         public int intValue(final EncodedMessage message) {
  1168.             return DataType.U_INT_10.decode(message).intValue();
  1169.         }
  1170.     },

  1171.     /** QZSS URA Number. */
  1172.     DF453 {
  1173.         /** {@inheritDoc} */
  1174.         @Override
  1175.         public int intValue(final EncodedMessage message) {
  1176.             return DataType.U_INT_4.decode(message).intValue();
  1177.         }
  1178.     },

  1179.     /** QZSS SV health. */
  1180.     DF454 {
  1181.         /** {@inheritDoc} */
  1182.         @Override
  1183.         public int intValue(final EncodedMessage message) {
  1184.             return DataType.U_INT_6.decode(message).intValue();
  1185.         }
  1186.     },

  1187.     /** QZSS t<sub>GD</sub>. */
  1188.     DF455 {
  1189.         /** {@inheritDoc} */
  1190.         @Override
  1191.         public double doubleValue(final EncodedMessage message) {
  1192.             return FastMath.scalb(DataType.INT_8.decode(message).doubleValue(), -31);
  1193.         }
  1194.     },

  1195.     /** QZSS IODC. */
  1196.     DF456 {
  1197.         /** {@inheritDoc} */
  1198.         @Override
  1199.         public int intValue(final EncodedMessage message) {
  1200.             return DataType.U_INT_10.decode(message).intValue();
  1201.         }
  1202.     },

  1203.     /** QZSS Fit Interval. */
  1204.     DF457 {
  1205.         /** {@inheritDoc} */
  1206.         @Override
  1207.         public int intValue(final EncodedMessage message) {
  1208.             return DataType.BIT_1.decode(message).intValue();
  1209.         }
  1210.     },

  1211.     /** Galileo Epoch Time 1s. */
  1212.     DF458 {
  1213.         // Ref: 1°/ "RTCM SPECIAL COMMITTEE NO.104, RTCM Paper 107-2014-SC104-818,
  1214.         //           Proposal of new RTCM SSR Messages SSR Stage 1: Galileo, QZSS, SBAS, BDS for RTCM STANDARD 10403.2"
  1215.         //      2°/ "Interface Specification for MADOCA-SEAD, Japan Aerospace Exploration Agency,
  1216.         //           October 2016, rev February 2017"
  1217.         /** {@inheritDoc} */
  1218.         @Override
  1219.         public int intValue(final EncodedMessage message) {
  1220.             return DataType.U_INT_20.decode(message).intValue();
  1221.         }
  1222.     },

  1223.     /** BDS Satellite ID. */
  1224.     DF488 {
  1225.         /** {@inheritDoc} */
  1226.         @Override
  1227.         public int intValue(final EncodedMessage message) {
  1228.             return DataType.U_INT_6.decode(message).intValue();
  1229.         }
  1230.     },

  1231.     /** BDS Week Number. */
  1232.     DF489 {
  1233.         /** {@inheritDoc} */
  1234.         @Override
  1235.         public int intValue(final EncodedMessage message) {
  1236.             return DataType.U_INT_13.decode(message).intValue();
  1237.         }
  1238.     },

  1239.     /** BDS SV URA Index. */
  1240.     DF490 {
  1241.         /** {@inheritDoc} */
  1242.         @Override
  1243.         public int intValue(final EncodedMessage message) {
  1244.             return DataType.BIT_4.decode(message).intValue();
  1245.         }
  1246.     },

  1247.     /** BDS IDOT. */
  1248.     DF491 {
  1249.         /** {@inheritDoc} */
  1250.         @Override
  1251.         public double doubleValue(final EncodedMessage message) {
  1252.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).doubleValue(), -43));
  1253.         }
  1254.     },

  1255.     /** BDS AODE. */
  1256.     DF492 {
  1257.         /** {@inheritDoc} */
  1258.         @Override
  1259.         public int intValue(final EncodedMessage message) {
  1260.             return DataType.U_INT_5.decode(message).intValue();
  1261.         }
  1262.     },

  1263.     /** BDS t<sub>oc</sub>. */
  1264.     DF493 {
  1265.         /** {@inheritDoc} */
  1266.         @Override
  1267.         public double doubleValue(final EncodedMessage message) {
  1268.             return DataType.U_INT_17.decode(message).doubleValue() * 8.0;
  1269.         }
  1270.     },

  1271.     /** BDS a<sub>f2</sub>. */
  1272.     DF494 {
  1273.         /** {@inheritDoc} */
  1274.         @Override
  1275.         public double doubleValue(final EncodedMessage message) {
  1276.             return FastMath.scalb(DataType.INT_11.decode(message).doubleValue(), -66);
  1277.         }
  1278.     },

  1279.     /** BDS a<sub>f1</sub>. */
  1280.     DF495 {
  1281.         /** {@inheritDoc} */
  1282.         @Override
  1283.         public double doubleValue(final EncodedMessage message) {
  1284.             return FastMath.scalb(DataType.INT_22.decode(message).doubleValue(), -50);
  1285.         }
  1286.     },

  1287.     /** BDS a<sub>f0</sub>. */
  1288.     DF496 {
  1289.         /** {@inheritDoc} */
  1290.         @Override
  1291.         public double doubleValue(final EncodedMessage message) {
  1292.             return FastMath.scalb(DataType.INT_24.decode(message).doubleValue(), -33);
  1293.         }
  1294.     },

  1295.     /** BDS AODC. */
  1296.     DF497 {
  1297.         /** {@inheritDoc} */
  1298.         @Override
  1299.         public int intValue(final EncodedMessage message) {
  1300.             return DataType.U_INT_5.decode(message).intValue();
  1301.         }
  1302.     },

  1303.     /** BDS C<sub>rs</sub>. */
  1304.     DF498 {
  1305.         /** {@inheritDoc} */
  1306.         @Override
  1307.         public double doubleValue(final EncodedMessage message) {
  1308.             return FastMath.scalb(DataType.INT_18.decode(message).doubleValue(), -6);
  1309.         }
  1310.     },

  1311.     /** BDS Δn. */
  1312.     DF499 {
  1313.         /** {@inheritDoc} */
  1314.         @Override
  1315.         public double doubleValue(final EncodedMessage message) {
  1316.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).doubleValue(), -43));
  1317.         }
  1318.     },

  1319.     /** BDS M<sub>0</sub>. */
  1320.     DF500 {
  1321.         /** {@inheritDoc} */
  1322.         @Override
  1323.         public double doubleValue(final EncodedMessage message) {
  1324.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1325.         }
  1326.     },

  1327.     /** BDS C<sub>uc</sub>. */
  1328.     DF501 {
  1329.         /** {@inheritDoc} */
  1330.         @Override
  1331.         public double doubleValue(final EncodedMessage message) {
  1332.             return FastMath.scalb(DataType.INT_18.decode(message).doubleValue(), -31);
  1333.         }
  1334.     },

  1335.     /** BDS e. */
  1336.     DF502 {
  1337.         /** {@inheritDoc} */
  1338.         @Override
  1339.         public double doubleValue(final EncodedMessage message) {
  1340.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  1341.         }
  1342.     },

  1343.     /** BDS C<sub>us</sub>. */
  1344.     DF503 {
  1345.         /** {@inheritDoc} */
  1346.         @Override
  1347.         public double doubleValue(final EncodedMessage message) {
  1348.             return FastMath.scalb(DataType.INT_18.decode(message).doubleValue(), -31);
  1349.         }
  1350.     },

  1351.     /** BDS a<sup>1/2</sup>. */
  1352.     DF504 {
  1353.         /** {@inheritDoc} */
  1354.         @Override
  1355.         public double doubleValue(final EncodedMessage message) {
  1356.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  1357.         }
  1358.     },

  1359.     /** BDS t<sub>oe</sub>. */
  1360.     DF505 {
  1361.         /** {@inheritDoc} */
  1362.         @Override
  1363.         public double doubleValue(final EncodedMessage message) {
  1364.             return DataType.U_INT_17.decode(message).doubleValue() * 8.0;
  1365.         }
  1366.     },

  1367.     /** BDS C<sub>ic</sub>. */
  1368.     DF506 {
  1369.         /** {@inheritDoc} */
  1370.         @Override
  1371.         public double doubleValue(final EncodedMessage message) {
  1372.             return FastMath.scalb(DataType.INT_18.decode(message).doubleValue(), -31);
  1373.         }
  1374.     },

  1375.     /** BDS Ω<sub>0</sub>. */
  1376.     DF507 {
  1377.         /** {@inheritDoc} */
  1378.         @Override
  1379.         public double doubleValue(final EncodedMessage message) {
  1380.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1381.         }
  1382.     },

  1383.     /** BDS C<sub>is</sub>. */
  1384.     DF508 {
  1385.         /** {@inheritDoc} */
  1386.         @Override
  1387.         public double doubleValue(final EncodedMessage message) {
  1388.             return FastMath.scalb(DataType.INT_18.decode(message).doubleValue(), -31);
  1389.         }
  1390.     },

  1391.     /** BDS i<sub>0</sub>. */
  1392.     DF509 {
  1393.         /** {@inheritDoc} */
  1394.         @Override
  1395.         public double doubleValue(final EncodedMessage message) {
  1396.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1397.         }
  1398.     },

  1399.     /** BDS C<sub>rc</sub>. */
  1400.     DF510 {
  1401.         /** {@inheritDoc} */
  1402.         @Override
  1403.         public double doubleValue(final EncodedMessage message) {
  1404.             return FastMath.scalb(DataType.INT_18.decode(message).doubleValue(), -6);
  1405.         }
  1406.     },

  1407.     /** BDS ω. */
  1408.     DF511 {
  1409.         /** {@inheritDoc} */
  1410.         @Override
  1411.         public double doubleValue(final EncodedMessage message) {
  1412.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).doubleValue(), -31));
  1413.         }
  1414.     },

  1415.     /** BDS OMEGADOT (Rate of Right Ascension). */
  1416.     DF512 {
  1417.         /** {@inheritDoc} */
  1418.         @Override
  1419.         public double doubleValue(final EncodedMessage message) {
  1420.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).doubleValue(), -43));
  1421.         }
  1422.     },

  1423.     /** BDS t<sub>GD1</sub>. */
  1424.     DF513 {
  1425.         /** {@inheritDoc} */
  1426.         @Override
  1427.         public double doubleValue(final EncodedMessage message) {
  1428.             return Units.NS.toSI(DataType.INT_10.decode(message).doubleValue() * 0.1);
  1429.         }
  1430.     },

  1431.     /** BDS t<sub>GD2</sub>. */
  1432.     DF514 {
  1433.         /** {@inheritDoc} */
  1434.         @Override
  1435.         public double doubleValue(final EncodedMessage message) {
  1436.             return Units.NS.toSI(DataType.INT_10.decode(message).doubleValue() * 0.1);
  1437.         }
  1438.     },

  1439.     /** BDS SV Health. */
  1440.     DF515 {
  1441.         /** {@inheritDoc} */
  1442.         @Override
  1443.         public int intValue(final EncodedMessage message) {
  1444.             return DataType.BIT_1.decode(message).intValue();
  1445.         }
  1446.     };

  1447. }