IgsSsrDataField.java

  1. /* Copyright 2002-2023 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.orekit.utils.units.Unit;

  20. /** Enum containing all intermediate level data fields that can be parsed
  21.  * to build an IGS SSR message.
  22.  * @author Bryan Cazabonne
  23.  * @since 11.0
  24.  */
  25. public enum IgsSsrDataField implements DataField {

  26.     /** IGS SSR Version. */
  27.     IDF001 {
  28.         /** {@inheritDoc} */
  29.         @Override
  30.         public int intValue(final EncodedMessage message) {
  31.             return DataType.U_INT_3.decode(message).intValue();
  32.         }
  33.     },

  34.     /** IGS Message number. */
  35.     IDF002 {
  36.         /** {@inheritDoc} */
  37.         @Override
  38.         public String stringValue(final EncodedMessage message, final int n) {
  39.             return String.format(Locale.US, "%3s", DataType.U_INT_8.decode(message).intValue()).trim();
  40.         }
  41.     },

  42.     /** SSR Epoch time 1s. */
  43.     IDF003 {
  44.         /** {@inheritDoc} */
  45.         @Override
  46.         public int intValue(final EncodedMessage message) {
  47.             return DataType.U_INT_20.decode(message).intValue();
  48.         }
  49.     },

  50.     /** SSR Update interval. */
  51.     IDF004 {
  52.         /** {@inheritDoc} */
  53.         @Override
  54.         public int intValue(final EncodedMessage message) {
  55.             switch (DataType.BIT_4.decode(message).byteValue()) {
  56.                 case 0  : return 1;
  57.                 case 1  : return 2;
  58.                 case 2  : return 5;
  59.                 case 3  : return 10;
  60.                 case 4  : return 15;
  61.                 case 5  : return 30;
  62.                 case 6  : return 60;
  63.                 case 7  : return 120;
  64.                 case 8  : return 240;
  65.                 case 9  : return 300;
  66.                 case 10 : return 600;
  67.                 case 11 : return 900;
  68.                 case 12 : return 1800;
  69.                 case 13 : return 3600;
  70.                 case 14 : return 7200;
  71.                 default : return 10800;
  72.             }
  73.         }
  74.     },

  75.     /** Multiple Message Indicator. */
  76.     IDF005 {
  77.         /** {@inheritDoc} */
  78.         @Override
  79.         public int intValue(final EncodedMessage message) {
  80.             return DataType.BIT_1.decode(message).intValue();
  81.         }
  82.     },

  83.     /** Global/Regional CRS Indicator. */
  84.     IDF006 {
  85.         /** {@inheritDoc} */
  86.         @Override
  87.         public int intValue(final EncodedMessage message) {
  88.             return DataType.BIT_1.decode(message).intValue();
  89.         }
  90.     },

  91.     /** IOD SSR. */
  92.     IDF007 {
  93.         /** {@inheritDoc} */
  94.         @Override
  95.         public int intValue(final EncodedMessage message) {
  96.             return DataType.U_INT_4.decode(message).intValue();
  97.         }
  98.     },

  99.     /** SSR Provider ID. */
  100.     IDF008 {
  101.         /** {@inheritDoc} */
  102.         @Override
  103.         public int intValue(final EncodedMessage message) {
  104.             return DataType.U_INT_16.decode(message).intValue();
  105.         }
  106.     },

  107.     /** SSR Solution ID. */
  108.     IDF009 {
  109.         /** {@inheritDoc} */
  110.         @Override
  111.         public int intValue(final EncodedMessage message) {
  112.             return DataType.U_INT_4.decode(message).intValue();
  113.         }
  114.     },

  115.     /** Number of satellites. */
  116.     IDF010 {
  117.         /** {@inheritDoc} */
  118.         @Override
  119.         public int intValue(final EncodedMessage message) {
  120.             return DataType.U_INT_6.decode(message).intValue();
  121.         }
  122.     },

  123.     /** GNSS satellite ID. */
  124.     IDF011 {
  125.         /** {@inheritDoc} */
  126.         @Override
  127.         public int intValue(final EncodedMessage message) {
  128.             return DataType.U_INT_6.decode(message).intValue();
  129.         }
  130.     },

  131.     /** GNSS IOD. */
  132.     IDF012 {
  133.         /** {@inheritDoc} */
  134.         @Override
  135.         public int intValue(final EncodedMessage message) {
  136.             return DataType.BIT_8.decode(message).intValue();
  137.         }
  138.     },

  139.     /** Delta Orbit Radial (m). */
  140.     IDF013 {
  141.         /** {@inheritDoc} */
  142.         @Override
  143.         public double doubleValue(final EncodedMessage message) {
  144.             return Units.MM.toSI(DataType.INT_22.decode(message).intValue() * 0.1);
  145.         }
  146.     },

  147.     /** Delta Along-Track (m). */
  148.     IDF014 {
  149.         /** {@inheritDoc} */
  150.         @Override
  151.         public double doubleValue(final EncodedMessage message) {
  152.             return Units.MM.toSI(DataType.INT_20.decode(message).intValue() * 0.4);
  153.         }
  154.     },

  155.     /** Delta Cross-Track (m). */
  156.     IDF015 {
  157.         /** {@inheritDoc} */
  158.         @Override
  159.         public double doubleValue(final EncodedMessage message) {
  160.             return Units.MM.toSI(DataType.INT_20.decode(message).intValue() * 0.4);
  161.         }
  162.     },

  163.     /** Dot Delta Radial (m/s). */
  164.     IDF016 {
  165.         /** {@inheritDoc} */
  166.         @Override
  167.         public double doubleValue(final EncodedMessage message) {
  168.             return Units.MM_PER_S.toSI(DataType.INT_21.decode(message).intValue() * 0.001);
  169.         }
  170.     },

  171.     /** Dot Delta Along-Track (m/s). */
  172.     IDF017 {
  173.         /** {@inheritDoc} */
  174.         @Override
  175.         public double doubleValue(final EncodedMessage message) {
  176.             return Units.MM_PER_S.toSI(DataType.INT_19.decode(message).intValue() * 0.004);
  177.         }
  178.     },

  179.     /** Dot Delta Cross-Track (m/s). */
  180.     IDF018 {
  181.         /** {@inheritDoc} */
  182.         @Override
  183.         public double doubleValue(final EncodedMessage message) {
  184.             return Units.MM_PER_S.toSI(DataType.INT_19.decode(message).intValue() * 0.004);
  185.         }
  186.     },

  187.     /** Delta Clock C0. */
  188.     IDF019 {
  189.         /** {@inheritDoc} */
  190.         @Override
  191.         public double doubleValue(final EncodedMessage message) {
  192.             return Units.MM.toSI(DataType.INT_22.decode(message).intValue() * 0.1);
  193.         }
  194.     },

  195.     /** Delta Clock C1. */
  196.     IDF020 {
  197.         /** {@inheritDoc} */
  198.         @Override
  199.         public double doubleValue(final EncodedMessage message) {
  200.             return Units.MM_PER_S.toSI(DataType.INT_21.decode(message).intValue() * 0.001);
  201.         }
  202.     },

  203.     /** Delta Clock C2. */
  204.     IDF021 {
  205.         /** {@inheritDoc} */
  206.         @Override
  207.         public double doubleValue(final EncodedMessage message) {
  208.             return Units.MM_PER_S2.toSI(DataType.INT_27.decode(message).intValue() * 0.00002);
  209.         }
  210.     },

  211.     /** High Rate Clock Correction. */
  212.     IDF022 {
  213.         /** {@inheritDoc} */
  214.         @Override
  215.         public double doubleValue(final EncodedMessage message) {
  216.             return Units.MM.toSI(DataType.INT_22.decode(message).intValue() * 0.1);
  217.         }
  218.     },

  219.     /** No. of Code Biases Processed. */
  220.     IDF023 {
  221.         /** {@inheritDoc} */
  222.         @Override
  223.         public int intValue(final EncodedMessage message) {
  224.             return DataType.U_INT_5.decode(message).intValue();
  225.         }
  226.     },

  227.     /** GNSS Signal and Tracking Mode Identifier. */
  228.     IDF024 {
  229.         /** {@inheritDoc} */
  230.         @Override
  231.         public int intValue(final EncodedMessage message) {
  232.             return DataType.U_INT_5.decode(message).intValue();
  233.         }
  234.     },

  235.     /** Code Bias for specified GNSS signal. */
  236.     IDF025 {
  237.         /** {@inheritDoc} */
  238.         @Override
  239.         public double doubleValue(final EncodedMessage message) {
  240.             return DataType.INT_14.decode(message).intValue() * 0.01;
  241.         }
  242.     },

  243.     /** Yaw angle used for computation of phase wind-up correction. */
  244.     IDF026 {
  245.         /** {@inheritDoc} */
  246.         @Override
  247.         public double doubleValue(final EncodedMessage message) {
  248.             return Units.SEMI_CIRCLE.toSI(DataType.U_INT_9.decode(message).intValue() / 256.0);
  249.         }
  250.     },

  251.     /** Yaw rate. */
  252.     IDF027 {
  253.         /** {@inheritDoc} */
  254.         @Override
  255.         public double doubleValue(final EncodedMessage message) {
  256.             return Units.SEMI_CIRCLE.toSI(DataType.INT_8.decode(message).intValue() / 8192.0);
  257.         }
  258.     },

  259.     /** Phase Bias for specified GNSS signal (m). */
  260.     IDF028 {
  261.         /** {@inheritDoc} */
  262.         @Override
  263.         public double doubleValue(final EncodedMessage message) {
  264.             return DataType.INT_20.decode(message).intValue() * 0.0001;
  265.         }
  266.     },

  267.     /** Signal Integer Indicator. */
  268.     IDF029 {
  269.         /** {@inheritDoc} */
  270.         @Override
  271.         public boolean booleanValue(final EncodedMessage message) {
  272.             return DataType.BIT_1.decode(message) > 0;
  273.         }
  274.     },

  275.     /** Signal Wide-Lane Integer Indicator. */
  276.     IDF030 {
  277.         /** {@inheritDoc} */
  278.         @Override
  279.         public int intValue(final EncodedMessage message) {
  280.             return DataType.BIT_2.decode(message).intValue();
  281.         }
  282.     },

  283.     /** Signal Discontinuity Counter. */
  284.     IDF031 {
  285.         /** {@inheritDoc} */
  286.         @Override
  287.         public int intValue(final EncodedMessage message) {
  288.             return DataType.U_INT_4.decode(message).intValue();
  289.         }
  290.     },

  291.     /** Dispersive Bias Consistency Indicator. */
  292.     IDF032 {
  293.         /** {@inheritDoc} */
  294.         @Override
  295.         public boolean booleanValue(final EncodedMessage message) {
  296.             return DataType.BIT_1.decode(message) > 0;
  297.         }
  298.     },

  299.     /** Melbourne-Wübbena Consistency Indicator. */
  300.     IDF033 {
  301.         /** {@inheritDoc} */
  302.         @Override
  303.         public boolean booleanValue(final EncodedMessage message) {
  304.             return DataType.BIT_1.decode(message) > 0;
  305.         }
  306.     },

  307.     /** SSR URA. */
  308.     IDF034 {
  309.         /** {@inheritDoc} */
  310.         @Override
  311.         public int intValue(final EncodedMessage message) {
  312.             return DataType.BIT_6.decode(message).intValue();
  313.         }
  314.     },

  315.     /** Number of Ionospheric Layers. */
  316.     IDF035 {
  317.         /** {@inheritDoc} */
  318.         @Override
  319.         public int intValue(final EncodedMessage message) {
  320.             // The parsed number is between 0 and 3. So, we need to add 1.
  321.             return DataType.U_INT_2.decode(message).intValue() + 1;
  322.         }
  323.     },

  324.     /** Height of the Ionospheric layer (m). */
  325.     IDF036 {
  326.         /** {@inheritDoc} */
  327.         @Override
  328.         public double doubleValue(final EncodedMessage message) {
  329.             // 10 km resolution
  330.             return Unit.KILOMETRE.toSI(DataType.U_INT_8.decode(message).intValue() * 10.0);
  331.         }
  332.     },

  333.     /** Spherical Harmonic Degree. */
  334.     IDF037 {
  335.         /** {@inheritDoc} */
  336.         @Override
  337.         public int intValue(final EncodedMessage message) {
  338.             // The parsed number is between 0 and 15. So, we need to add 1.
  339.             return DataType.U_INT_4.decode(message).intValue() + 1;
  340.         }
  341.     },

  342.     /** Spherical Harmonic Order. */
  343.     IDF038 {
  344.         /** {@inheritDoc} */
  345.         @Override
  346.         public int intValue(final EncodedMessage message) {
  347.             // The parsed number is between 0 and 15. So, we need to add 1.
  348.             return DataType.U_INT_4.decode(message).intValue() + 1;
  349.         }
  350.     },

  351.     /** Spherical Harmonic Coefficient C (TECU). */
  352.     IDF039 {
  353.         /** {@inheritDoc} */
  354.         @Override
  355.         public double doubleValue(final EncodedMessage message) {
  356.             return DataType.INT_16.decode(message).intValue() * 0.005;
  357.         }
  358.     },

  359.     /** Spherical Harmonic Coefficient S (TECU). */
  360.     IDF040 {
  361.         /** {@inheritDoc} */
  362.         @Override
  363.         public double doubleValue(final EncodedMessage message) {
  364.             return DataType.INT_16.decode(message).intValue() * 0.005;
  365.         }
  366.     },

  367.     /** VTEC Quality Indicator (TECU). */
  368.     IDF041 {
  369.         /** {@inheritDoc} */
  370.         @Override
  371.         public double doubleValue(final EncodedMessage message) {
  372.             return DataType.U_INT_9.decode(message).intValue() * 0.05;
  373.         }
  374.     };

  375. }