Rtcm1020Data.java
/* Copyright 2002-2023 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;
}
}