IgsSsrDataField.java

/* Copyright 2002-2024 CS GROUP
 * Licensed to CS GROUP (CS) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * CS licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.orekit.gnss.metric.parser;

import java.util.Locale;

import org.orekit.utils.units.Unit;

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

    /** IGS SSR Version. */
    IDF001 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_3.decode(message).intValue();
        }
    },

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

    /** SSR Epoch time 1s. */
    IDF003 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_20.decode(message).intValue();
        }
    },

    /** SSR Update interval. */
    IDF004 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            switch (DataType.BIT_4.decode(message).byteValue()) {
                case 0  : return 1;
                case 1  : return 2;
                case 2  : return 5;
                case 3  : return 10;
                case 4  : return 15;
                case 5  : return 30;
                case 6  : return 60;
                case 7  : return 120;
                case 8  : return 240;
                case 9  : return 300;
                case 10 : return 600;
                case 11 : return 900;
                case 12 : return 1800;
                case 13 : return 3600;
                case 14 : return 7200;
                default : return 10800;
            }
        }
    },

    /** Multiple Message Indicator. */
    IDF005 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.BIT_1.decode(message).intValue();
        }
    },

    /** Global/Regional CRS Indicator. */
    IDF006 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.BIT_1.decode(message).intValue();
        }
    },

    /** IOD SSR. */
    IDF007 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_4.decode(message).intValue();
        }
    },

    /** SSR Provider ID. */
    IDF008 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_16.decode(message).intValue();
        }
    },

    /** SSR Solution ID. */
    IDF009 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_4.decode(message).intValue();
        }
    },

    /** Number of satellites. */
    IDF010 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_6.decode(message).intValue();
        }
    },

    /** GNSS satellite ID. */
    IDF011 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_6.decode(message).intValue();
        }
    },

    /** GNSS IOD. */
    IDF012 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.BIT_8.decode(message).intValue();
        }
    },

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

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

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

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

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

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

    /** Delta Clock C0. */
    IDF019 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return Units.MM.toSI(DataType.INT_22.decode(message).intValue() * 0.1);
        }
    },

    /** Delta Clock C1. */
    IDF020 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return Units.MM_PER_S.toSI(DataType.INT_21.decode(message).intValue() * 0.001);
        }
    },

    /** Delta Clock C2. */
    IDF021 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return Units.MM_PER_S2.toSI(DataType.INT_27.decode(message).intValue() * 0.00002);
        }
    },

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

    /** No. of Code Biases Processed. */
    IDF023 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_5.decode(message).intValue();
        }
    },

    /** GNSS Signal and Tracking Mode Identifier. */
    IDF024 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_5.decode(message).intValue();
        }
    },

    /** Code Bias for specified GNSS signal. */
    IDF025 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return DataType.INT_14.decode(message).intValue() * 0.01;
        }
    },

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

    /** Yaw rate. */
    IDF027 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return Units.SEMI_CIRCLE.toSI(DataType.INT_8.decode(message).intValue() / 8192.0);
        }
    },

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

    /** Signal Integer Indicator. */
    IDF029 {
        /** {@inheritDoc} */
        @Override
        public boolean booleanValue(final EncodedMessage message) {
            return DataType.BIT_1.decode(message) > 0;
        }
    },

    /** Signal Wide-Lane Integer Indicator. */
    IDF030 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.BIT_2.decode(message).intValue();
        }
    },

    /** Signal Discontinuity Counter. */
    IDF031 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.U_INT_4.decode(message).intValue();
        }
    },

    /** Dispersive Bias Consistency Indicator. */
    IDF032 {
        /** {@inheritDoc} */
        @Override
        public boolean booleanValue(final EncodedMessage message) {
            return DataType.BIT_1.decode(message) > 0;
        }
    },

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

    /** SSR URA. */
    IDF034 {
        /** {@inheritDoc} */
        @Override
        public int intValue(final EncodedMessage message) {
            return DataType.BIT_6.decode(message).intValue();
        }
    },

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

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

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

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

    /** Spherical Harmonic Coefficient C (TECU). */
    IDF039 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return DataType.INT_16.decode(message).intValue() * 0.005;
        }
    },

    /** Spherical Harmonic Coefficient S (TECU). */
    IDF040 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return DataType.INT_16.decode(message).intValue() * 0.005;
        }
    },

    /** VTEC Quality Indicator (TECU). */
    IDF041 {
        /** {@inheritDoc} */
        @Override
        public double doubleValue(final EncodedMessage message) {
            return DataType.U_INT_9.decode(message).intValue() * 0.05;
        }
    };

}