Rtcm1020Data.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.messages.rtcm.ephemeris;

import org.orekit.annotation.DefaultDataContext;
import org.orekit.data.DataContext;
import org.orekit.propagation.analytical.gnss.data.GLONASSNavigationMessage;
import org.orekit.propagation.numerical.GLONASSNumericalPropagator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.GLONASSDate;
import org.orekit.time.TimeScales;

/**
 * Container for RTCM 1020 data.
 * <p>
 * Spacecraft coordinates read from this RTCM message are given in PZ-90.02 frame.
 * </p>
 * @author Bryan Cazabonne
 * @since 11.0
 */
public class Rtcm1020Data extends RtcmEphemerisData {

    /** Glonass navigation message. */
    private GLONASSNavigationMessage glonassNavigationMessage;

    /** Number of the current four year interval. */
    private int n4;

    /** Number of the current day in a four year interval. */
    private int nt;

    /** Almanac health availability indicator. */
    private boolean healthAvailabilityIndicator;

    /** Glonass P1 Word. */
    private int p1;

    /** Time referenced to the beginning of the frame within the current day [s]. */
    private double tk;

    /** Glonass B<sub>n</sub> Word. */
    private int bN;

    /** Glonass P2 Word. */
    private int p2;

    /** Glonass P3 Word. */
    private int p3;

    /** Glonass P Word. */
    private int p;

    /** Glonass l<sub>n</sub> (third string). */
    private int lNThirdString;

    /**
     * Glonass time difference between navigation RF signal transmitted
     * in L2 sub-band and navigation RF signal transmitted in L1 sub-band.
     */
    private double deltaTauN;

    /** Glonass E<sub>n</sub> Word. */
    private int eN;

    /** Glonass P4 Word. */
    private int p4;

    /** Glonass F<sub>T</sub> Word. */
    private int fT;

    /** Glonass M word. */
    private int m;

    /** Flag indicating if additional parameters are in the message. */
    private boolean areAdditionalDataAvailable;

    /** Glonass N<sup>A</sup> Word. */
    private int nA;

    /** Glonass time scale correction to UTC time. */
    private double tauC;

    /** Correction to GPS time relative to GLONASS time. */
    private double tauGps;

    /** Glonass l<sub>n</sub> (fifth string). */
    private int lNFifthString;

    /** Constructor. */
    public Rtcm1020Data() {
        // Nothing to do ...
    }

    /**
     * Get the Glonass navigation message corresponding to the current RTCM data.
     * <p>
     * This object can be used to initialize a {@link GLONASSNumericalPropagator}
     * <p>
     * This method uses the {@link DataContext#getDefault()} to initialize
     * the time scales used to configure the reference epochs of the navigation
     * message.
     *
     * @return the Glonass navigation message
     */
    @DefaultDataContext
    public GLONASSNavigationMessage getGlonassNavigationMessage() {
        return getGlonassNavigationMessage(DataContext.getDefault().getTimeScales());
    }

    /**
     * Get the Glonass navigation message corresponding to the current RTCM data.
     * <p>
     * This object can be used to initialize a {@link GLONASSNumericalPropagator}
     * <p>
     * When calling this method, the reference epochs of the navigation message
     * (i.e. ephemeris and clock epochs) are initialized using the provided time scales.
     *
     * @param timeScales time scales to use for initializing epochs
     * @return the Glonass navigation message
     */
    public GLONASSNavigationMessage getGlonassNavigationMessage(final TimeScales timeScales) {

        final double tb = glonassNavigationMessage.getTime();

        // Set the ephemeris reference data
        final AbsoluteDate refDate = new GLONASSDate(nt, n4, tb, timeScales.getGLONASS()).getDate();
        glonassNavigationMessage.setDate(refDate);
        glonassNavigationMessage.setEpochToc(refDate);

        // Return the navigation message
        return glonassNavigationMessage;

    }

    /**
     * Set the Glonass navigation message.
     * @param glonassNavigationMessage the Glonass navigation message to set
     */
    public void setGlonassNavigationMessage(final GLONASSNavigationMessage glonassNavigationMessage) {
        this.glonassNavigationMessage = glonassNavigationMessage;
    }

    /**
     * Get the four-year interval number starting from 1996.
     * @return the four-year interval number starting from 1996
     */
    public int getN4() {
        return n4;
    }

    /**
     * Set the four-year interval number starting from 1996.
     * @param n4 the number to set
     */
    public void setN4(final int n4) {
        this.n4 = n4;
    }

    /**
     * Get the current date.
     * <p>
     * Current date is a calendar number of day within four-year interval
     * starting from the 1-st of January in a leap year
     * </p>
     * @return the current date
     */
    public int getNt() {
        return nt;
    }

    /**
     * Set the current date.
     * @param nt the current date to set
     */
    public void setNt(final int nt) {
        this.nt = nt;
    }

    /**
     * Get the flag indicating if GLONASS almanac health is available.
     * @return true if GLONASS almanac health is available
     */
    public boolean isHealthAvailable() {
        return healthAvailabilityIndicator;
    }

    /**
     * Set the flag indicating if GLONASS almanac health is available.
     * @param healthAvailabilityIndicator true if GLONASS almanac health is available
     */
    public void setHealthAvailabilityIndicator(final boolean healthAvailabilityIndicator) {
        this.healthAvailabilityIndicator = healthAvailabilityIndicator;
    }

    /**
     * Get the GLONASS P1 Word.
     * <p>
     * Word P1 is a flag of the immediate data updating. It indicates a time interval
     * between two adjacent values of {@link GLONASSNavigationMessage#getTime() tb}
     * parameter (in seconds).
     * </p>
     * @return the GLONASS P1 Word
     */
    public int getP1() {
        return p1;
    }

    /**
     * Set the GLONASS P1 Word.
     * @param p1 the GLONASS P1 Word to set
     */
    public void setP1(final int p1) {
        this.p1 = p1;
    }

    /**
     * Get the time referenced to the beginning of the frame within the current day.
     * @return the time in seconds
     */
    public double getTk() {
        return tk;
    }

    /**
     * Set the time referenced to the beginning of the frame within the current day.
     * @param tk the time to set in seconds
     */
    public void setTk(final double tk) {
        this.tk = tk;
    }

    /**
     * Get the GLONASS B<sub>n</sub> Word.
     * <p>
     * Word B<sub>n</sub> is the health flag
     * </p>
     * @return the GLONASS B<sub>n</sub> Word
     */
    public int getBN() {
        return bN;
    }

    /**
     * Set the GLONASS B<sub>n</sub> Word.
     * @param word the word to set
     */
    public void setBN(final int word) {
        this.bN = word;
    }

    /**
     * Get the GLONASS P2 Word.
     * <p>
     * Word P2 is flag of oddness ("1") or evenness ("0") of the value of
     * {@link GLONASSNavigationMessage#getTime() tb}.
     * </p>
     * @return the GLONASS P2 Word
     */
    public int getP2() {
        return p2;
    }

    /**
     * Set the GLONASS P2 Word.
     * @param p2 the GLONASS P2 Word to set
     */
    public void setP2(final int p2) {
        this.p2 = p2;
    }

    /**
     * Get the GLONASS P3 Word.
     * <p>
     * Word P3 is flag indicating a number of satellites for which almanac is
     * transmitted within given frame
     * </p>
     * @return the GLONASS P3 Word
     */
    public int getP3() {
        return p3;
    }

    /**
     * Set the the GLONASS P3 Word.
     * @param p3 the GLONASS P3 Word to set
     */
    public void setP3(final int p3) {
        this.p3 = p3;
    }

    /**
     * Get the GLONASS P Word.
     * <p>
     * Word P is a technological parameter of control segment,
     * indication the satellite operation mode in respect of
     * time parameters.
     * </p>
     * @return the GLONASS P Word
     */
    public int getP() {
        return p;
    }

    /**
     * Set the GLONASS P Word.
     * @param p the GLONASS P Word to set
     */
    public void setP(final int p) {
        this.p = p;
    }

    /**
     * Get the GLONASS l<sub>n</sub> Word extracted from third string of the subframe.
     * @return the GLONASS l<sub>n</sub> (third string)
     */
    public int getLNThirdString() {
        return lNThirdString;
    }

    /**
     * Set the GLONASS l<sub>n</sub> Word extracted from third string of the subframe.
     * @param word the word to set
     */
    public void setLNThirdString(final int word) {
        this.lNThirdString = word;
    }

    /**
     * Get the deltaTauN value.
     * <p>
     * It represents the GLONASS time difference between navigation RF signal
     * transmitted in L2 sub-band and navigation RF signal transmitted in L1 sub-band.
     * </p>
     * @return deltaTauN
     */
    public double getDeltaTN() {
        return deltaTauN;
    }

    /**
     * Set the deltaTauN value.
     * @param deltaTN the value to set
     */
    public void setDeltaTN(final double deltaTN) {
        this.deltaTauN = deltaTN;
    }

    /**
     * Get the GLONASS E<sub>n</sub> Word.
     * <p>
     * It characterises the "age" of a current information.
     * </p>
     * @return the GLONASS E<sub>n</sub> Word in days
     */
    public int getEn() {
        return eN;
    }

    /**
     * Get the GLONASS E<sub>n</sub> Word.
     * @param word the word to set
     */
    public void setEn(final int word) {
        this.eN = word;
    }

    /**
     * Get the GLONASS P4 Word.
     * <p>
     * GLONASS P4 Word is a flag to show that ephemeris parameters are present.
     * "1" indicates that updated ephemeris or frequency/time parameters have been
     * uploaded by the control segment
     * </p>
     * @return the GLONASS P4 Word
     */
    public int getP4() {
        return p4;
    }

    /**
     * Set the GLONASS P4 Word.
     * @param p4 the GLONASS P4 Word to set
     */
    public void setP4(final int p4) {
        this.p4 = p4;
    }

    /**
     * Get the GLONASS F<sub>T</sub> Word.
     * <p>
     * It is a parameter that provides the predicted satellite user range accuracy
     * at time {@link GLONASSNavigationMessage#getTime() tb}.
     * </p>
     * @return the GLONASS F<sub>T</sub> Word
     */
    public int getFT() {
        return fT;
    }

    /**
     * Set the GLONASS F<sub>T</sub> Word.
     * @param word the word to set
     */
    public void setFT(final int word) {
        this.fT = word;
    }

    /**
     * Get the GLONASS M Word.
     * <p>
     * Word M represents the type of satellite transmitting navigation signal.
     * "0" refers to GLONASS satellite, "1" refers to a GLONASS-M satellite.
     * </p>
     * @return the GLONASS M Word
     */
    public int getM() {
        return m;
    }

    /**
     * Set the GLONASS M Word.
     * @param m the GLONASS M Word to set
     */
    public void setM(final int m) {
        this.m = m;
    }

    /**
     * Get the flag indicating if additional parameters are in the message.
     * @return true if additional parameters are in the message
     */
    public boolean areAdditionalDataAvailable() {
        return areAdditionalDataAvailable;
    }

    /**
     * Set the flag indicating if additional parameters are in the message.
     * @param areAdditionalDataAvailable true if additional parameters are in the message
     */
    public void setAreAdditionalDataAvailable(final boolean areAdditionalDataAvailable) {
        this.areAdditionalDataAvailable = areAdditionalDataAvailable;
    }

    /**
     * Get the GLONASS N<sup>A</sup> Word.
     * <p>
     * It is the calendar day number within the four-year period beginning since
     * the leap year. It is used for almanac data.
     * </p>
     * @return the GLONASS N<sup>A</sup> Word
     */
    public int getNA() {
        return nA;
    }

    /**
     * Set the GLONASS N<sup>A</sup> Word.
     * @param word the word to set
     */
    public void setNA(final int word) {
        this.nA = word;
    }

    /**
     * Get the GLONASS time scale correction to UTC time.
     * @return the GLONASS time scale correction to UTC time in seconds
     */
    public double getTauC() {
        return tauC;
    }

    /**
     * Set the GLONASS time scale correction to UTC time.
     * @param tauC the value to set in seconds.
     */
    public void setTauC(final double tauC) {
        this.tauC = tauC;
    }

    /**
     * Get the correction to GPS time relative to GLONASS time.
     * @return the correction to GPS time relative to GLONASS time in seconds
     */
    public double getTauGps() {
        return tauGps;
    }

    /**
     * Set the correction to GPS time relative to GLONASS time.
     * @param tauGps the value to set in seconds
     */
    public void setTauGps(final double tauGps) {
        this.tauGps = tauGps;
    }

    /**
     * Get the GLONASS l<sub>n</sub> Word extracted from fifth string of the subframe.
     * @return the GLONASS l<sub>n</sub> (fifth string)
     */
    public int getLNFifthString() {
        return lNFifthString;
    }

    /**
     * Set the GLONASS l<sub>n</sub> Word extracted from fifth string of the subframe.
     * @param word the word to set
     */
    public void setLNFifthString(final int word) {
        this.lNFifthString = word;
    }

}