RtcmDataField.java

  1. /* Copyright 2002-2022 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.     /** GPS IODE (Issue Of Data, Ephemeris). */
  61.     DF071 {
  62.         /** {@inheritDoc} */
  63.         @Override
  64.         public int intValue(final EncodedMessage message) {
  65.             return DataType.BIT_8.decode(message).intValue();
  66.         }
  67.     },

  68.     /** GPS Week number. */
  69.     DF076 {
  70.         /** {@inheritDoc} */
  71.         @Override
  72.         public int intValue(final EncodedMessage message) {
  73.             return DataType.U_INT_10.decode(message).intValue();
  74.         }
  75.     },

  76.     /** GPS SV Accuracy. */
  77.     DF077 {
  78.         /** {@inheritDoc} */
  79.         @Override
  80.         public int intValue(final EncodedMessage message) {
  81.             return DataType.U_INT_4.decode(message).intValue();
  82.         }
  83.     },

  84.     /** GPS CODE ON L2. */
  85.     DF078 {
  86.         /** {@inheritDoc} */
  87.         @Override
  88.         public int intValue(final EncodedMessage message) {
  89.             return DataType.BIT_2.decode(message).intValue();
  90.         }
  91.     },

  92.     /** GPS Rate of Inclination Angle. */
  93.     DF079 {
  94.         /** {@inheritDoc} */
  95.         @Override
  96.         public double doubleValue(final EncodedMessage message) {
  97.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
  98.         }
  99.     },

  100.     /** GPS toc. */
  101.     DF081 {
  102.         /** {@inheritDoc} */
  103.         @Override
  104.         public double doubleValue(final EncodedMessage message) {
  105.             return DataType.U_INT_16.decode(message).intValue() * 16.0;
  106.         }
  107.     },

  108.     /** GPS a<sub>f2</sub>. */
  109.     DF082 {
  110.         /** {@inheritDoc} */
  111.         @Override
  112.         public double doubleValue(final EncodedMessage message) {
  113.             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -55);
  114.         }
  115.     },

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

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

  132.     /** GPS IODC (Issue Of Data, Clock). */
  133.     DF085 {
  134.         /** {@inheritDoc} */
  135.         @Override
  136.         public int intValue(final EncodedMessage message) {
  137.             return DataType.U_INT_10.decode(message).intValue();
  138.         }
  139.     },

  140.     /** GPS C<sub>rs</sub>. */
  141.     DF086 {
  142.         /** {@inheritDoc} */
  143.         @Override
  144.         public double doubleValue(final EncodedMessage message) {
  145.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
  146.         }
  147.     },

  148.     /** GPS Δn (DELTA n). */
  149.     DF087 {
  150.         /** {@inheritDoc} */
  151.         @Override
  152.         public double doubleValue(final EncodedMessage message) {
  153.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
  154.         }
  155.     },

  156.     /** GPS M<sub>0</sub>. */
  157.     DF088 {
  158.         /** {@inheritDoc} */
  159.         @Override
  160.         public double doubleValue(final EncodedMessage message) {
  161.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  162.         }
  163.     },

  164.     /** GPS C<sub>uc</sub>. */
  165.     DF089 {
  166.         /** {@inheritDoc} */
  167.         @Override
  168.         public double doubleValue(final EncodedMessage message) {
  169.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  170.         }
  171.     },

  172.     /** GPS Eccentricity (e). */
  173.     DF090 {
  174.         /** {@inheritDoc} */
  175.         @Override
  176.         public double doubleValue(final EncodedMessage message) {
  177.             return FastMath.scalb(DataType.U_INT_32.decode(message).longValue(), -33);
  178.         }
  179.     },

  180.     /** GPS C<sub>us</sub>. */
  181.     DF091 {
  182.         /** {@inheritDoc} */
  183.         @Override
  184.         public double doubleValue(final EncodedMessage message) {
  185.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  186.         }
  187.     },

  188.     /** GPS A<sup>1/2</sup>. */
  189.     DF092 {
  190.         /** {@inheritDoc} */
  191.         @Override
  192.         public double doubleValue(final EncodedMessage message) {
  193.             return FastMath.scalb(DataType.U_INT_32.decode(message).longValue(), -19);
  194.         }
  195.     },

  196.     /** GPS t<sub>oe</sub>. */
  197.     DF093 {
  198.         /** {@inheritDoc} */
  199.         @Override
  200.         public double doubleValue(final EncodedMessage message) {
  201.             return DataType.U_INT_16.decode(message).intValue() * 16.0;
  202.         }
  203.     },

  204.     /** GPS C<sub>ic</sub>. */
  205.     DF094 {
  206.         /** {@inheritDoc} */
  207.         @Override
  208.         public double doubleValue(final EncodedMessage message) {
  209.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  210.         }
  211.     },

  212.     /** GPS Ω<sub>0</sub> (OMEGA)<sub>0</sub>. */
  213.     DF095 {
  214.         /** {@inheritDoc} */
  215.         @Override
  216.         public double doubleValue(final EncodedMessage message) {
  217.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  218.         }
  219.     },

  220.     /** GPS C<sub>is</sub>. */
  221.     DF096 {
  222.         /** {@inheritDoc} */
  223.         @Override
  224.         public double doubleValue(final EncodedMessage message) {
  225.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  226.         }
  227.     },

  228.     /** GPS i<sub>0</sub>. */
  229.     DF097 {
  230.         /** {@inheritDoc} */
  231.         @Override
  232.         public double doubleValue(final EncodedMessage message) {
  233.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  234.         }
  235.     },

  236.     /** GPS C<sub>rc</sub>. */
  237.     DF098 {
  238.         /** {@inheritDoc} */
  239.         @Override
  240.         public double doubleValue(final EncodedMessage message) {
  241.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
  242.         }
  243.     },

  244.     /** GPS ω (Argument of Perigee). */
  245.     DF099 {
  246.         /** {@inheritDoc} */
  247.         @Override
  248.         public double doubleValue(final EncodedMessage message) {
  249.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  250.         }
  251.     },

  252.     /** GPS OMEGADOT (Rate of Right Ascension). */
  253.     DF100 {
  254.         /** {@inheritDoc} */
  255.         @Override
  256.         public double doubleValue(final EncodedMessage message) {
  257.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
  258.         }
  259.     },

  260.     /** GPS t<sub>GD</sub>. */
  261.     DF101 {
  262.         /** {@inheritDoc} */
  263.         @Override
  264.         public double doubleValue(final EncodedMessage message) {
  265.             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -31);
  266.         }
  267.     },

  268.     /** GPS SV HEALTH. */
  269.     DF102 {
  270.         /** {@inheritDoc} */
  271.         @Override
  272.         public int intValue(final EncodedMessage message) {
  273.             return DataType.U_INT_6.decode(message).intValue();
  274.         }
  275.     },

  276.     /** GPS L2 P data flag. */
  277.     DF103 {
  278.         /** {@inheritDoc} */
  279.         @Override
  280.         public boolean booleanValue(final EncodedMessage message) {
  281.             return DataType.BIT_1.decode(message) == 0;
  282.         }
  283.     },

  284.     /** GLONASS almanac health (C<sub>n</sub> word). */
  285.     DF104 {
  286.         /** {@inheritDoc} */
  287.         @Override
  288.         public int intValue(final EncodedMessage message) {
  289.             return DataType.BIT_1.decode(message).intValue();
  290.         }
  291.     },

  292.     /** GLONASS almanac health availability indicator. */
  293.     DF105 {
  294.         /** {@inheritDoc} */
  295.         @Override
  296.         public boolean booleanValue(final EncodedMessage message) {
  297.             return DataType.BIT_1.decode(message) > 0;
  298.         }
  299.     },

  300.     /** GLONASS P1. */
  301.     DF106 {
  302.         /** {@inheritDoc} */
  303.         @Override
  304.         public int intValue(final EncodedMessage message) {
  305.             // Word P1 indicates a time interval (in sec) between two adjacent values of tb parameter
  306.             switch(DataType.BIT_2.decode(message).intValue()) {
  307.                 case 0  : return 0;
  308.                 case 1  : return 1800;
  309.                 case 2  : return 2700;
  310.                 default : return 3600;
  311.             }
  312.         }
  313.     },

  314.     /** GLONASS t<sub>k</sub> (s). */
  315.     DF107 {
  316.         /** {@inheritDoc} */
  317.         @Override
  318.         public double doubleValue(final EncodedMessage message) {
  319.             final int    hours    = DataType.U_INT_5.decode(message).intValue();
  320.             final int    minutes  = DataType.U_INT_6.decode(message).intValue();
  321.             final double secondes = DataType.BIT_1.decode(message).intValue() * 30.0;
  322.             return hours * 3600.0 + minutes * 60.0 + secondes;
  323.         }
  324.     },

  325.     /** GLONASS MSB of B<sub>n</sub> word. */
  326.     DF108 {
  327.         /** {@inheritDoc} */
  328.         @Override
  329.         public int intValue(final EncodedMessage message) {
  330.             return DataType.BIT_1.decode(message).intValue();
  331.         }
  332.     },

  333.     /** GLONASS P2 Flag. */
  334.     DF109 {
  335.         /** {@inheritDoc} */
  336.         @Override
  337.         public int intValue(final EncodedMessage message) {
  338.             return DataType.BIT_1.decode(message).intValue();
  339.         }
  340.     },

  341.     /** GLONASS t<sub>b</sub>. */
  342.     DF110 {
  343.         /** {@inheritDoc} */
  344.         @Override
  345.         public double doubleValue(final EncodedMessage message) {
  346.             return Unit.MINUTE.toSI(DataType.U_INT_7.decode(message).intValue() * 15.0);
  347.         }
  348.     },

  349.     /** GLONASS x<sub>n</sub> (t<sub>b</sub>), first derivative. */
  350.     DF111 {
  351.         /** {@inheritDoc} */
  352.         @Override
  353.         public double doubleValue(final EncodedMessage message) {
  354.             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).intValue(), -20));
  355.         }
  356.     },

  357.     /** GLONASS x<sub>n</sub> (t<sub>b</sub>). */
  358.     DF112 {
  359.         /** {@inheritDoc} */
  360.         @Override
  361.         public double doubleValue(final EncodedMessage message) {
  362.             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).intValue(), -11));
  363.         }
  364.     },

  365.     /** GLONASS x<sub>n</sub> (t<sub>b</sub>), second derivative. */
  366.     DF113 {
  367.         /** {@inheritDoc} */
  368.         @Override
  369.         public double doubleValue(final EncodedMessage message) {
  370.             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30));
  371.         }
  372.     },

  373.     /** GLONASS y<sub>n</sub> (t<sub>b</sub>), first derivative. */
  374.     DF114 {
  375.         /** {@inheritDoc} */
  376.         @Override
  377.         public double doubleValue(final EncodedMessage message) {
  378.             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).intValue(), -20));
  379.         }
  380.     },

  381.     /** GLONASS y<sub>n</sub> (t<sub>b</sub>). */
  382.     DF115 {
  383.         /** {@inheritDoc} */
  384.         @Override
  385.         public double doubleValue(final EncodedMessage message) {
  386.             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).intValue(), -11));
  387.         }
  388.     },

  389.     /** GLONASS y<sub>n</sub> (t<sub>b</sub>), second derivative. */
  390.     DF116 {
  391.         /** {@inheritDoc} */
  392.         @Override
  393.         public double doubleValue(final EncodedMessage message) {
  394.             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30));
  395.         }
  396.     },

  397.     /** GLONASS z<sub>n</sub> (t<sub>b</sub>), first derivative. */
  398.     DF117 {
  399.         /** {@inheritDoc} */
  400.         @Override
  401.         public double doubleValue(final EncodedMessage message) {
  402.             return Units.KM_PER_S.toSI(FastMath.scalb(DataType.INT_S_24.decode(message).intValue(), -20));
  403.         }
  404.     },

  405.     /** GLONASS z<sub>n</sub> (t<sub>b</sub>). */
  406.     DF118 {
  407.         /** {@inheritDoc} */
  408.         @Override
  409.         public double doubleValue(final EncodedMessage message) {
  410.             return Unit.KILOMETRE.toSI(FastMath.scalb(DataType.INT_S_27.decode(message).intValue(), -11));
  411.         }
  412.     },

  413.     /** GLONASS z<sub>n</sub> (t<sub>b</sub>), second derivative. */
  414.     DF119 {
  415.         /** {@inheritDoc} */
  416.         @Override
  417.         public double doubleValue(final EncodedMessage message) {
  418.             return Units.KM_PER_S2.toSI(FastMath.scalb(DataType.INT_S_5.decode(message).intValue(), -30));
  419.         }
  420.     },

  421.     /** GLONASS P3 Flag. */
  422.     DF120 {
  423.         /** {@inheritDoc} */
  424.         @Override
  425.         public int intValue(final EncodedMessage message) {
  426.             // Flag indicating a number of satellites for which almanac is transmitted within given frame
  427.             if (DataType.BIT_1.decode(message) == 0) {
  428.                 return 4;
  429.             } else {
  430.                 return 5;
  431.             }
  432.         }
  433.     },

  434.     /** GLONASS γ<sub>n</sub> (t<sub>b</sub>). */
  435.     DF121 {
  436.         /** {@inheritDoc} */
  437.         @Override
  438.         public double doubleValue(final EncodedMessage message) {
  439.             return FastMath.scalb(DataType.INT_S_11.decode(message).intValue(), -40);
  440.         }
  441.     },

  442.     /** GLONASS-M P. */
  443.     DF122 {
  444.         /** {@inheritDoc} */
  445.         @Override
  446.         public int intValue(final EncodedMessage message) {
  447.             return DataType.BIT_2.decode(message).intValue();
  448.         }
  449.     },

  450.     /** GLONASS-M l<sub>n</sub> (third string). */
  451.     DF123 {
  452.         /** {@inheritDoc} */
  453.         @Override
  454.         public int intValue(final EncodedMessage message) {
  455.             return DataType.BIT_1.decode(message).intValue();
  456.         }
  457.     },

  458.     /** GLONASS τ<sub>n</sub> (t<sub>b</sub>). */
  459.     DF124 {
  460.         /** {@inheritDoc} */
  461.         @Override
  462.         public double doubleValue(final EncodedMessage message) {
  463.             return FastMath.scalb(DataType.INT_S_22.decode(message).intValue(), -30);
  464.         }
  465.     },

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

  474.     /** GLONASS E<sub>n</sub>. */
  475.     DF126 {
  476.         /** {@inheritDoc} */
  477.         @Override
  478.         public int intValue(final EncodedMessage message) {
  479.             return DataType.U_INT_5.decode(message).intValue();
  480.         }
  481.     },

  482.     /** GLONASS-M P4. */
  483.     DF127 {
  484.         /** {@inheritDoc} */
  485.         @Override
  486.         public int intValue(final EncodedMessage message) {
  487.             return DataType.BIT_1.decode(message).intValue();
  488.         }
  489.     },

  490.     /** GLONASS-M F<sub>T</sub>. */
  491.     DF128 {
  492.         /** {@inheritDoc} */
  493.         @Override
  494.         public int intValue(final EncodedMessage message) {
  495.             return DataType.U_INT_4.decode(message).intValue();
  496.         }
  497.     },

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

  506.     /** GLONASS-M M. */
  507.     DF130 {
  508.         /** {@inheritDoc} */
  509.         @Override
  510.         public int intValue(final EncodedMessage message) {
  511.             return DataType.BIT_2.decode(message).intValue();
  512.         }
  513.     },

  514.     /** GLONASS The Availability of Additional Data. */
  515.     DF131 {
  516.         /** {@inheritDoc} */
  517.         @Override
  518.         public boolean booleanValue(final EncodedMessage message) {
  519.             return DataType.BIT_1.decode(message) > 0;
  520.         }
  521.     },

  522.     /** GLONASS N<sup>A</sup>. */
  523.     DF132 {
  524.         /** {@inheritDoc} */
  525.         @Override
  526.         public int intValue(final EncodedMessage message) {
  527.             return DataType.U_INT_11.decode(message).intValue();
  528.         }
  529.     },

  530.     /** GLONASS τ<sub>c</sub>. */
  531.     DF133 {
  532.         /** {@inheritDoc} */
  533.         @Override
  534.         public double doubleValue(final EncodedMessage message) {
  535.             return FastMath.scalb(DataType.INT_S_32.decode(message).intValue(), -31);
  536.         }
  537.     },

  538.     /** GLONASS-M N<sub>4</sub>. */
  539.     DF134 {
  540.         /** {@inheritDoc} */
  541.         @Override
  542.         public int intValue(final EncodedMessage message) {
  543.             return DataType.U_INT_5.decode(message).intValue();
  544.         }
  545.     },

  546.     /** GLONASS τ<sub>GPS</sub>. */
  547.     DF135 {
  548.         /** {@inheritDoc} */
  549.         @Override
  550.         public double doubleValue(final EncodedMessage message) {
  551.             return FastMath.scalb(DataType.INT_S_22.decode(message).intValue(), -31);
  552.         }
  553.     },

  554.     /** GLONASS-M l<sub>n</sub> (fifth string). */
  555.     DF136 {
  556.         /** {@inheritDoc} */
  557.         @Override
  558.         public int intValue(final EncodedMessage message) {
  559.             return DataType.BIT_1.decode(message).intValue();
  560.         }
  561.     },

  562.     /** GPS Fit Interval. */
  563.     DF137 {
  564.         /** {@inheritDoc} */
  565.         @Override
  566.         public int intValue(final EncodedMessage message) {
  567.             return DataType.BIT_1.decode(message).intValue();
  568.         }
  569.     },

  570.     /** Galileo Satellite ID. */
  571.     DF252 {
  572.         /** {@inheritDoc} */
  573.         @Override
  574.         public int intValue(final EncodedMessage message) {
  575.             return DataType.U_INT_6.decode(message).intValue();
  576.         }
  577.     },

  578.     /** Galileo Week Number (WN). */
  579.     DF289 {
  580.         /** {@inheritDoc} */
  581.         @Override
  582.         public int intValue(final EncodedMessage message) {
  583.             return DataType.U_INT_12.decode(message).intValue();
  584.         }
  585.     },

  586.     /** Galileo IODnav. */
  587.     DF290 {
  588.         /** {@inheritDoc} */
  589.         @Override
  590.         public int intValue(final EncodedMessage message) {
  591.             return DataType.U_INT_10.decode(message).intValue();
  592.         }
  593.     },

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

  602.     /** Galileo IDOT. */
  603.     DF292 {
  604.         /** {@inheritDoc} */
  605.         @Override
  606.         public double doubleValue(final EncodedMessage message) {
  607.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
  608.         }
  609.     },

  610.     /** Galileo t<sub>oc</sub>. */
  611.     DF293 {
  612.         /** {@inheritDoc} */
  613.         @Override
  614.         public double doubleValue(final EncodedMessage message) {
  615.             return DataType.U_INT_14.decode(message).intValue() * 60.0;
  616.         }
  617.     },

  618.     /** Galileo a<sub>f2</sub>. */
  619.     DF294 {
  620.         /** {@inheritDoc} */
  621.         @Override
  622.         public double doubleValue(final EncodedMessage message) {
  623.             return FastMath.scalb(DataType.INT_6.decode(message).intValue(), -59);
  624.         }
  625.     },

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

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

  642.     /** Galileo C<sub>rs</sub>. */
  643.     DF297 {
  644.         /** {@inheritDoc} */
  645.         @Override
  646.         public double doubleValue(final EncodedMessage message) {
  647.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
  648.         }
  649.     },

  650.     /** Galileo Δn. */
  651.     DF298 {
  652.         /** {@inheritDoc} */
  653.         @Override
  654.         public double doubleValue(final EncodedMessage message) {
  655.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
  656.         }
  657.     },

  658.     /** Galileo M<sub>0</sub>. */
  659.     DF299 {
  660.         /** {@inheritDoc} */
  661.         @Override
  662.         public double doubleValue(final EncodedMessage message) {
  663.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  664.         }
  665.     },

  666.     /** Galileo C<sub>uc</sub>. */
  667.     DF300 {
  668.         /** {@inheritDoc} */
  669.         @Override
  670.         public double doubleValue(final EncodedMessage message) {
  671.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  672.         }
  673.     },

  674.     /** Galileo e. */
  675.     DF301 {
  676.         /** {@inheritDoc} */
  677.         @Override
  678.         public double doubleValue(final EncodedMessage message) {
  679.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  680.         }
  681.     },

  682.     /** Galileo C<sub>us</sub>. */
  683.     DF302 {
  684.         /** {@inheritDoc} */
  685.         @Override
  686.         public double doubleValue(final EncodedMessage message) {
  687.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  688.         }
  689.     },

  690.     /** Galileo A<sup>1/2</sup>. */
  691.     DF303 {
  692.         /** {@inheritDoc} */
  693.         @Override
  694.         public double doubleValue(final EncodedMessage message) {
  695.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  696.         }
  697.     },

  698.     /** Galileo t<sub>oe</sub>. */
  699.     DF304 {
  700.         /** {@inheritDoc} */
  701.         @Override
  702.         public double doubleValue(final EncodedMessage message) {
  703.             return DataType.U_INT_14.decode(message).intValue() * 60.0;
  704.         }
  705.     },

  706.     /** Galileo C<sub>ic</sub>. */
  707.     DF305 {
  708.         /** {@inheritDoc} */
  709.         @Override
  710.         public double doubleValue(final EncodedMessage message) {
  711.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  712.         }
  713.     },

  714.     /** Galileo Ω<sub>0</sub>. */
  715.     DF306 {
  716.         /** {@inheritDoc} */
  717.         @Override
  718.         public double doubleValue(final EncodedMessage message) {
  719.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  720.         }
  721.     },

  722.     /** Galileo C<sub>is</sub>. */
  723.     DF307 {
  724.         /** {@inheritDoc} */
  725.         @Override
  726.         public double doubleValue(final EncodedMessage message) {
  727.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  728.         }
  729.     },

  730.     /** Galileo i<sub>0</sub>. */
  731.     DF308 {
  732.         /** {@inheritDoc} */
  733.         @Override
  734.         public double doubleValue(final EncodedMessage message) {
  735.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  736.         }
  737.     },

  738.     /** Galileo C<sub>rc</sub>. */
  739.     DF309 {
  740.         /** {@inheritDoc} */
  741.         @Override
  742.         public double doubleValue(final EncodedMessage message) {
  743.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
  744.         }
  745.     },

  746.     /** Galileo ω. */
  747.     DF310 {
  748.         /** {@inheritDoc} */
  749.         @Override
  750.         public double doubleValue(final EncodedMessage message) {
  751.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  752.         }
  753.     },

  754.     /** Galileo OMEGADOT (Rate of Right Ascension). */
  755.     DF311 {
  756.         /** {@inheritDoc} */
  757.         @Override
  758.         public double doubleValue(final EncodedMessage message) {
  759.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
  760.         }
  761.     },

  762.     /** Galileo BGD (E1/E5a). */
  763.     DF312 {
  764.         /** {@inheritDoc} */
  765.         @Override
  766.         public double doubleValue(final EncodedMessage message) {
  767.             return FastMath.scalb(DataType.INT_10.decode(message).intValue(), -32);
  768.         }
  769.     },

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

  778.     /** E5a SIGNAL Health Status. */
  779.     DF314 {
  780.         /** {@inheritDoc} */
  781.         @Override
  782.         public int intValue(final EncodedMessage message) {
  783.             return DataType.BIT_2.decode(message).intValue();
  784.         }
  785.     },

  786.     /** E5a Data Validity Status. */
  787.     DF315 {
  788.         /** {@inheritDoc} */
  789.         @Override
  790.         public int intValue(final EncodedMessage message) {
  791.             return DataType.BIT_1.decode(message).intValue();
  792.         }
  793.     },

  794.     /** Galileo SOL NAV Signal Health Status (SOLHS). */
  795.     DF316 {
  796.         /** {@inheritDoc} */
  797.         @Override
  798.         public int intValue(final EncodedMessage message) {
  799.             return DataType.BIT_2.decode(message).intValue();
  800.         }
  801.     },

  802.     /** Galileo SOL NAV Data Validity Status (SOLDVS). */
  803.     DF317 {
  804.         /** {@inheritDoc} */
  805.         @Override
  806.         public int intValue(final EncodedMessage message) {
  807.             return DataType.BIT_1.decode(message).intValue();
  808.         }
  809.     },

  810.     /** QZSS Satellite ID. */
  811.     DF429 {
  812.         /** {@inheritDoc} */
  813.         @Override
  814.         public int intValue(final EncodedMessage message) {
  815.             // 1 refers to satellite 193, 2 refers to satellite 194, etc.
  816.             return DataType.U_INT_4.decode(message).intValue() + 192;
  817.         }
  818.     },

  819.     /** QZSS t<sub>oc</sub>. */
  820.     DF430 {
  821.         /** {@inheritDoc} */
  822.         @Override
  823.         public double doubleValue(final EncodedMessage message) {
  824.             return DataType.U_INT_16.decode(message).intValue() * 16.0;
  825.         }
  826.     },

  827.     /** QZSS a<sub>f2</sub>. */
  828.     DF431 {
  829.         /** {@inheritDoc} */
  830.         @Override
  831.         public double doubleValue(final EncodedMessage message) {
  832.             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -55);
  833.         }
  834.     },

  835.     /** QZSS a<sub>f1</sub>. */
  836.     DF432 {
  837.         /** {@inheritDoc} */
  838.         @Override
  839.         public double doubleValue(final EncodedMessage message) {
  840.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43);
  841.         }
  842.     },

  843.     /** QZSS a<sub>f0</sub>. */
  844.     DF433 {
  845.         /** {@inheritDoc} */
  846.         @Override
  847.         public double doubleValue(final EncodedMessage message) {
  848.             return FastMath.scalb(DataType.INT_22.decode(message).intValue(), -31);
  849.         }
  850.     },

  851.     /** QZSS IODE. */
  852.     DF434 {
  853.         /** {@inheritDoc} */
  854.         @Override
  855.         public int intValue(final EncodedMessage message) {
  856.             return DataType.U_INT_8.decode(message).intValue();
  857.         }
  858.     },

  859.     /** QZSS C<sub>rs</sub>. */
  860.     DF435 {
  861.         /** {@inheritDoc} */
  862.         @Override
  863.         public double doubleValue(final EncodedMessage message) {
  864.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
  865.         }
  866.     },

  867.     /** QZSS Δn. */
  868.     DF436 {
  869.         /** {@inheritDoc} */
  870.         @Override
  871.         public double doubleValue(final EncodedMessage message) {
  872.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
  873.         }
  874.     },

  875.     /** QZSS M<sub>0</sub>. */
  876.     DF437 {
  877.         /** {@inheritDoc} */
  878.         @Override
  879.         public double doubleValue(final EncodedMessage message) {
  880.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  881.         }
  882.     },

  883.     /** QZSS C<sub>uc</sub>. */
  884.     DF438 {
  885.         /** {@inheritDoc} */
  886.         @Override
  887.         public double doubleValue(final EncodedMessage message) {
  888.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  889.         }
  890.     },

  891.     /** QZSS e. */
  892.     DF439 {
  893.         /** {@inheritDoc} */
  894.         @Override
  895.         public double doubleValue(final EncodedMessage message) {
  896.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  897.         }
  898.     },

  899.     /** QZSS C<sub>us</sub>. */
  900.     DF440 {
  901.         /** {@inheritDoc} */
  902.         @Override
  903.         public double doubleValue(final EncodedMessage message) {
  904.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  905.         }
  906.     },

  907.     /** QZSS A<sup>1/2</sup>. */
  908.     DF441 {
  909.         /** {@inheritDoc} */
  910.         @Override
  911.         public double doubleValue(final EncodedMessage message) {
  912.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  913.         }
  914.     },

  915.     /** QZSS t<sub>oe</sub>. */
  916.     DF442 {
  917.         /** {@inheritDoc} */
  918.         @Override
  919.         public double doubleValue(final EncodedMessage message) {
  920.             return DataType.U_INT_16.decode(message).intValue() * 16.0;
  921.         }
  922.     },

  923.     /** QZSS C<sub>ic</sub>. */
  924.     DF443 {
  925.         /** {@inheritDoc} */
  926.         @Override
  927.         public double doubleValue(final EncodedMessage message) {
  928.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  929.         }
  930.     },

  931.     /** QZSS Ω<sub>0</sub>. */
  932.     DF444 {
  933.         /** {@inheritDoc} */
  934.         @Override
  935.         public double doubleValue(final EncodedMessage message) {
  936.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  937.         }
  938.     },

  939.     /** QZSS C<sub>is</sub>. */
  940.     DF445 {
  941.         /** {@inheritDoc} */
  942.         @Override
  943.         public double doubleValue(final EncodedMessage message) {
  944.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -29);
  945.         }
  946.     },

  947.     /** QZSS i<sub>0</sub>. */
  948.     DF446 {
  949.         /** {@inheritDoc} */
  950.         @Override
  951.         public double doubleValue(final EncodedMessage message) {
  952.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  953.         }
  954.     },

  955.     /** QZSS C<sub>rc</sub>. */
  956.     DF447 {
  957.         /** {@inheritDoc} */
  958.         @Override
  959.         public double doubleValue(final EncodedMessage message) {
  960.             return FastMath.scalb(DataType.INT_16.decode(message).intValue(), -5);
  961.         }
  962.     },

  963.     /** QZSS ω. */
  964.     DF448 {
  965.         /** {@inheritDoc} */
  966.         @Override
  967.         public double doubleValue(final EncodedMessage message) {
  968.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  969.         }
  970.     },

  971.     /** QZSS OMEGADOT (Rate of Right Ascension). */
  972.     DF449 {
  973.         /** {@inheritDoc} */
  974.         @Override
  975.         public double doubleValue(final EncodedMessage message) {
  976.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
  977.         }
  978.     },

  979.     /** QZSS iDOT. */
  980.     DF450 {
  981.         /** {@inheritDoc} */
  982.         @Override
  983.         public double doubleValue(final EncodedMessage message) {
  984.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
  985.         }
  986.     },

  987.     /** QZSS Codes on L2 Channel. */
  988.     DF451 {
  989.         /** {@inheritDoc} */
  990.         @Override
  991.         public int intValue(final EncodedMessage message) {
  992.             return DataType.BIT_2.decode(message).intValue();
  993.         }
  994.     },

  995.     /** QZSS Week Number. */
  996.     DF452 {
  997.         /** {@inheritDoc} */
  998.         @Override
  999.         public int intValue(final EncodedMessage message) {
  1000.             return DataType.U_INT_10.decode(message).intValue();
  1001.         }
  1002.     },

  1003.     /** QZSS URA Number. */
  1004.     DF453 {
  1005.         /** {@inheritDoc} */
  1006.         @Override
  1007.         public int intValue(final EncodedMessage message) {
  1008.             return DataType.U_INT_4.decode(message).intValue();
  1009.         }
  1010.     },

  1011.     /** QZSS SV health. */
  1012.     DF454 {
  1013.         /** {@inheritDoc} */
  1014.         @Override
  1015.         public int intValue(final EncodedMessage message) {
  1016.             return DataType.U_INT_6.decode(message).intValue();
  1017.         }
  1018.     },

  1019.     /** QZSS t<sub>GD</sub>. */
  1020.     DF455 {
  1021.         /** {@inheritDoc} */
  1022.         @Override
  1023.         public double doubleValue(final EncodedMessage message) {
  1024.             return FastMath.scalb(DataType.INT_8.decode(message).intValue(), -31);
  1025.         }
  1026.     },

  1027.     /** QZSS IODC. */
  1028.     DF456 {
  1029.         /** {@inheritDoc} */
  1030.         @Override
  1031.         public int intValue(final EncodedMessage message) {
  1032.             return DataType.U_INT_10.decode(message).intValue();
  1033.         }
  1034.     },

  1035.     /** QZSS Fit Interval. */
  1036.     DF457 {
  1037.         /** {@inheritDoc} */
  1038.         @Override
  1039.         public int intValue(final EncodedMessage message) {
  1040.             return DataType.BIT_1.decode(message).intValue();
  1041.         }
  1042.     },

  1043.     /** BDS Satellite ID. */
  1044.     DF488 {
  1045.         /** {@inheritDoc} */
  1046.         @Override
  1047.         public int intValue(final EncodedMessage message) {
  1048.             return DataType.U_INT_6.decode(message).intValue();
  1049.         }
  1050.     },

  1051.     /** BDS Week Number. */
  1052.     DF489 {
  1053.         /** {@inheritDoc} */
  1054.         @Override
  1055.         public int intValue(final EncodedMessage message) {
  1056.             return DataType.U_INT_13.decode(message).intValue();
  1057.         }
  1058.     },

  1059.     /** BDS SV URA Index. */
  1060.     DF490 {
  1061.         /** {@inheritDoc} */
  1062.         @Override
  1063.         public int intValue(final EncodedMessage message) {
  1064.             return DataType.BIT_4.decode(message).intValue();
  1065.         }
  1066.     },

  1067.     /** BDS IDOT. */
  1068.     DF491 {
  1069.         /** {@inheritDoc} */
  1070.         @Override
  1071.         public double doubleValue(final EncodedMessage message) {
  1072.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_14.decode(message).intValue(), -43));
  1073.         }
  1074.     },

  1075.     /** BDS AODE. */
  1076.     DF492 {
  1077.         /** {@inheritDoc} */
  1078.         @Override
  1079.         public int intValue(final EncodedMessage message) {
  1080.             return DataType.U_INT_5.decode(message).intValue();
  1081.         }
  1082.     },

  1083.     /** BDS t<sub>oc</sub>. */
  1084.     DF493 {
  1085.         /** {@inheritDoc} */
  1086.         @Override
  1087.         public double doubleValue(final EncodedMessage message) {
  1088.             return DataType.U_INT_17.decode(message).intValue() * 8.0;
  1089.         }
  1090.     },

  1091.     /** BDS a<sub>f2</sub>. */
  1092.     DF494 {
  1093.         /** {@inheritDoc} */
  1094.         @Override
  1095.         public double doubleValue(final EncodedMessage message) {
  1096.             return FastMath.scalb(DataType.INT_11.decode(message).intValue(), -66);
  1097.         }
  1098.     },

  1099.     /** BDS a<sub>f1</sub>. */
  1100.     DF495 {
  1101.         /** {@inheritDoc} */
  1102.         @Override
  1103.         public double doubleValue(final EncodedMessage message) {
  1104.             return FastMath.scalb(DataType.INT_22.decode(message).intValue(), -50);
  1105.         }
  1106.     },

  1107.     /** BDS a<sub>f0</sub>. */
  1108.     DF496 {
  1109.         /** {@inheritDoc} */
  1110.         @Override
  1111.         public double doubleValue(final EncodedMessage message) {
  1112.             return FastMath.scalb(DataType.INT_24.decode(message).intValue(), -33);
  1113.         }
  1114.     },

  1115.     /** BDS AODC. */
  1116.     DF497 {
  1117.         /** {@inheritDoc} */
  1118.         @Override
  1119.         public int intValue(final EncodedMessage message) {
  1120.             return DataType.U_INT_5.decode(message).intValue();
  1121.         }
  1122.     },

  1123.     /** BDS C<sub>rs</sub>. */
  1124.     DF498 {
  1125.         /** {@inheritDoc} */
  1126.         @Override
  1127.         public double doubleValue(final EncodedMessage message) {
  1128.             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -6);
  1129.         }
  1130.     },

  1131.     /** BDS Δn. */
  1132.     DF499 {
  1133.         /** {@inheritDoc} */
  1134.         @Override
  1135.         public double doubleValue(final EncodedMessage message) {
  1136.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_16.decode(message).intValue(), -43));
  1137.         }
  1138.     },

  1139.     /** BDS M<sub>0</sub>. */
  1140.     DF500 {
  1141.         /** {@inheritDoc} */
  1142.         @Override
  1143.         public double doubleValue(final EncodedMessage message) {
  1144.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  1145.         }
  1146.     },

  1147.     /** BDS C<sub>uc</sub>. */
  1148.     DF501 {
  1149.         /** {@inheritDoc} */
  1150.         @Override
  1151.         public double doubleValue(final EncodedMessage message) {
  1152.             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
  1153.         }
  1154.     },

  1155.     /** BDS e. */
  1156.     DF502 {
  1157.         /** {@inheritDoc} */
  1158.         @Override
  1159.         public double doubleValue(final EncodedMessage message) {
  1160.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -33);
  1161.         }
  1162.     },

  1163.     /** BDS C<sub>us</sub>. */
  1164.     DF503 {
  1165.         /** {@inheritDoc} */
  1166.         @Override
  1167.         public double doubleValue(final EncodedMessage message) {
  1168.             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
  1169.         }
  1170.     },

  1171.     /** BDS a<sup>1/2</sup>. */
  1172.     DF504 {
  1173.         /** {@inheritDoc} */
  1174.         @Override
  1175.         public double doubleValue(final EncodedMessage message) {
  1176.             return FastMath.scalb(DataType.U_INT_32.decode(message).doubleValue(), -19);
  1177.         }
  1178.     },

  1179.     /** BDS t<sub>oe</sub>. */
  1180.     DF505 {
  1181.         /** {@inheritDoc} */
  1182.         @Override
  1183.         public double doubleValue(final EncodedMessage message) {
  1184.             return DataType.U_INT_17.decode(message).intValue() * 8.0;
  1185.         }
  1186.     },

  1187.     /** BDS C<sub>ic</sub>. */
  1188.     DF506 {
  1189.         /** {@inheritDoc} */
  1190.         @Override
  1191.         public double doubleValue(final EncodedMessage message) {
  1192.             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
  1193.         }
  1194.     },

  1195.     /** BDS Ω<sub>0</sub>. */
  1196.     DF507 {
  1197.         /** {@inheritDoc} */
  1198.         @Override
  1199.         public double doubleValue(final EncodedMessage message) {
  1200.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  1201.         }
  1202.     },

  1203.     /** BDS C<sub>is</sub>. */
  1204.     DF508 {
  1205.         /** {@inheritDoc} */
  1206.         @Override
  1207.         public double doubleValue(final EncodedMessage message) {
  1208.             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -31);
  1209.         }
  1210.     },

  1211.     /** BDS i<sub>0</sub>. */
  1212.     DF509 {
  1213.         /** {@inheritDoc} */
  1214.         @Override
  1215.         public double doubleValue(final EncodedMessage message) {
  1216.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  1217.         }
  1218.     },

  1219.     /** BDS C<sub>rc</sub>. */
  1220.     DF510 {
  1221.         /** {@inheritDoc} */
  1222.         @Override
  1223.         public double doubleValue(final EncodedMessage message) {
  1224.             return FastMath.scalb(DataType.INT_18.decode(message).intValue(), -6);
  1225.         }
  1226.     },

  1227.     /** BDS ω. */
  1228.     DF511 {
  1229.         /** {@inheritDoc} */
  1230.         @Override
  1231.         public double doubleValue(final EncodedMessage message) {
  1232.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_32.decode(message).intValue(), -31));
  1233.         }
  1234.     },

  1235.     /** BDS OMEGADOT (Rate of Right Ascension). */
  1236.     DF512 {
  1237.         /** {@inheritDoc} */
  1238.         @Override
  1239.         public double doubleValue(final EncodedMessage message) {
  1240.             return Units.SEMI_CIRCLE.toSI(FastMath.scalb(DataType.INT_24.decode(message).intValue(), -43));
  1241.         }
  1242.     },

  1243.     /** BDS t<sub>GD1</sub>. */
  1244.     DF513 {
  1245.         /** {@inheritDoc} */
  1246.         @Override
  1247.         public double doubleValue(final EncodedMessage message) {
  1248.             return Units.NS.toSI(DataType.INT_10.decode(message).intValue() * 0.1);
  1249.         }
  1250.     },

  1251.     /** BDS t<sub>GD2</sub>. */
  1252.     DF514 {
  1253.         /** {@inheritDoc} */
  1254.         @Override
  1255.         public double doubleValue(final EncodedMessage message) {
  1256.             return Units.NS.toSI(DataType.INT_10.decode(message).intValue() * 0.1);
  1257.         }
  1258.     },

  1259.     /** BDS SV Health. */
  1260.     DF515 {
  1261.         /** {@inheritDoc} */
  1262.         @Override
  1263.         public int intValue(final EncodedMessage message) {
  1264.             return DataType.BIT_1.decode(message).intValue();
  1265.         }
  1266.     };

  1267. }