RinexNavigation.java

  1. /* Copyright 2002-2025 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.files.rinex.navigation;

  18. import java.util.ArrayList;
  19. import java.util.Collections;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;

  23. import org.orekit.files.rinex.RinexFile;
  24. import org.orekit.gnss.SatelliteSystem;
  25. import org.orekit.models.earth.ionosphere.KlobucharIonoModel;
  26. import org.orekit.models.earth.ionosphere.nequick.NeQuickModel;
  27. import org.orekit.propagation.analytical.gnss.data.BeidouCivilianNavigationMessage;
  28. import org.orekit.propagation.analytical.gnss.data.BeidouLegacyNavigationMessage;
  29. import org.orekit.propagation.analytical.gnss.data.GLONASSNavigationMessage;
  30. import org.orekit.propagation.analytical.gnss.data.GPSCivilianNavigationMessage;
  31. import org.orekit.propagation.analytical.gnss.data.GPSLegacyNavigationMessage;
  32. import org.orekit.propagation.analytical.gnss.data.GalileoNavigationMessage;
  33. import org.orekit.propagation.analytical.gnss.data.NavICL1NVNavigationMessage;
  34. import org.orekit.propagation.analytical.gnss.data.NavICLegacyNavigationMessage;
  35. import org.orekit.propagation.analytical.gnss.data.QZSSCivilianNavigationMessage;
  36. import org.orekit.propagation.analytical.gnss.data.QZSSLegacyNavigationMessage;
  37. import org.orekit.propagation.analytical.gnss.data.SBASNavigationMessage;

  38. /**
  39.  * Represents a parsed RINEX navigation messages files.
  40.  * @author Bryan Cazabonne
  41.  * @author Luc Maisonobe
  42.  * @since 11.0
  43.  */
  44. public class RinexNavigation extends RinexFile<RinexNavigationHeader> {

  45.     /** The 4 Klobuchar coefficients of a cubic equation representing the amplitude of the vertical delay. */
  46.     private double[] klobucharAlpha;

  47.     /** The 4 coefficients of a cubic equation representing the period of the model. */
  48.     private double[] klobucharBeta;

  49.     /** The three ionospheric coefficients broadcast in the Galileo navigation message. */
  50.     private double[] neQuickAlpha;

  51.     /** A map containing the GPS navigation messages. */
  52.     private final Map<String, List<GPSLegacyNavigationMessage>> gpsLegacyData;

  53.     /** A map containing the GPS navigation messages. */
  54.     private final Map<String, List<GPSCivilianNavigationMessage>> gpsCivilianData;

  55.     /** A map containing the Galileo navigation messages. */
  56.     private final Map<String, List<GalileoNavigationMessage>> galileoData;

  57.     /** A map containing the Beidou navigation messages. */
  58.     private final Map<String, List<BeidouLegacyNavigationMessage>> beidouLegacyData;

  59.     /** A map containing the Beidou navigation messages. */
  60.     private final Map<String, List<BeidouCivilianNavigationMessage>> beidouCivilianData;

  61.     /** A map containing the QZSS navigation messages. */
  62.     private final Map<String, List<QZSSLegacyNavigationMessage>> qzssLegacyData;

  63.     /** A map containing the QZSS navigation messages. */
  64.     private final Map<String, List<QZSSCivilianNavigationMessage>> qzssCivilianData;

  65.     /** A map containing the NavIC navigation messages. */
  66.     private final Map<String, List<NavICLegacyNavigationMessage>> navicLegacyData;

  67.     /** A map containing the NavIC navigation messages.
  68.      * @since 13.0
  69.      */
  70.     private final Map<String, List<NavICL1NVNavigationMessage>> navicL1NVData;

  71.     /** A map containing the GLONASS navigation messages. */
  72.     private final Map<String, List<GLONASSNavigationMessage>> glonassData;

  73.     /** A map containing the SBAS navigation messages. */
  74.     private final Map<String, List<SBASNavigationMessage>> sbasData;

  75.     /** System time offsets.
  76.      * @since 12.0
  77.      */
  78.     private final List<SystemTimeOffsetMessage> systemTimeOffsets;

  79.     /** Earth orientation parameters.
  80.      * @since 12.0
  81.      */
  82.     private final List<EarthOrientationParameterMessage> eops;

  83.     /** Ionosphere Klobuchar messages.
  84.      * @since 12.0
  85.      */
  86.     private final List<IonosphereKlobucharMessage> klobucharMessages;

  87.     /** Ionosphere Nequick G messages.
  88.      * @since 12.0
  89.      */
  90.     private final List<IonosphereNequickGMessage> nequickGMessages;

  91.     /** Ionosphere BDGIM messages.
  92.      * @since 12.0
  93.      */
  94.     private final List<IonosphereBDGIMMessage> bdgimMessages;

  95.     /** Constructor. */
  96.     public RinexNavigation() {
  97.         super(new RinexNavigationHeader());
  98.         this.gpsLegacyData      = new HashMap<>();
  99.         this.gpsCivilianData    = new HashMap<>();
  100.         this.galileoData        = new HashMap<>();
  101.         this.beidouLegacyData   = new HashMap<>();
  102.         this.beidouCivilianData = new HashMap<>();
  103.         this.qzssLegacyData     = new HashMap<>();
  104.         this.qzssCivilianData   = new HashMap<>();
  105.         this.navicLegacyData    = new HashMap<>();
  106.         this.navicL1NVData = new HashMap<>();
  107.         this.glonassData        = new HashMap<>();
  108.         this.sbasData           = new HashMap<>();
  109.         this.systemTimeOffsets  = new ArrayList<>();
  110.         this.eops               = new ArrayList<>();
  111.         this.klobucharMessages  = new ArrayList<>();
  112.         this.nequickGMessages   = new ArrayList<>();
  113.         this.bdgimMessages      = new ArrayList<>();
  114.     }

  115.     /**
  116.      * Get the "alpha" ionospheric parameters.
  117.      * <p>
  118.      * They are used to initialize the {@link KlobucharIonoModel}.
  119.      * </p>
  120.      * @return the "alpha" ionospheric parameters
  121.      */
  122.     public double[] getKlobucharAlpha() {
  123.         return klobucharAlpha.clone();
  124.     }

  125.     /**
  126.      * Set the "alpha" ionspheric parameters.
  127.      * @param klobucharAlpha the "alpha" ionspheric parameters to set
  128.      */
  129.     public void setKlobucharAlpha(final double[] klobucharAlpha) {
  130.         this.klobucharAlpha = klobucharAlpha.clone();
  131.     }

  132.     /**
  133.      * Get the "beta" ionospheric parameters.
  134.      * <p>
  135.      * They are used to initialize the {@link KlobucharIonoModel}.
  136.      * </p>
  137.      * @return the "beta" ionospheric parameters
  138.      */
  139.     public double[] getKlobucharBeta() {
  140.         return klobucharBeta.clone();
  141.     }

  142.     /**
  143.      * Set the "beta" ionospheric parameters.
  144.      * @param klobucharBeta the "beta" ionospheric parameters to set
  145.      */
  146.     public void setKlobucharBeta(final double[] klobucharBeta) {
  147.         this.klobucharBeta = klobucharBeta.clone();
  148.     }

  149.     /**
  150.      * Get the "alpha" ionospheric parameters.
  151.      * <p>
  152.      * They are used to initialize the {@link NeQuickModel}.
  153.      * </p>
  154.      * @return the "alpha" ionospheric parameters
  155.      */
  156.     public double[] getNeQuickAlpha() {
  157.         return neQuickAlpha.clone();
  158.     }

  159.     /**
  160.      * Set the "alpha" ionospheric parameters.
  161.      * @param neQuickAlpha the "alpha" ionospheric parameters to set
  162.      */
  163.     public void setNeQuickAlpha(final double[] neQuickAlpha) {
  164.         this.neQuickAlpha = neQuickAlpha.clone();
  165.     }

  166.     /**
  167.      * Get all the GPS legacy navigation messages contained in the file.
  168.      * @return an unmodifiable list of GPS legacy navigation messages
  169.      * @since 12.0
  170.      */
  171.     public Map<String, List<GPSLegacyNavigationMessage>> getGPSLegacyNavigationMessages() {
  172.         return Collections.unmodifiableMap(gpsLegacyData);
  173.     }

  174.     /**
  175.      * Get the GPS legacy navigation messages for the given satellite Id.
  176.      * @param satId satellite Id (i.e. Satellite System (e.g. G) + satellite number)
  177.      * @return an unmodifiable list of GPS legacy navigation messages
  178.      * @since 12.0
  179.      */
  180.     public List<GPSLegacyNavigationMessage> getGPSLegacyNavigationMessages(final String satId) {
  181.         return Collections.unmodifiableList(gpsLegacyData.get(satId));
  182.     }

  183.     /**
  184.      * Add a GPS legacy navigation message to the list.
  185.      * @param message message to add
  186.      * @since 12.0
  187.      */
  188.     public void addGPSLegacyNavigationMessage(final GPSLegacyNavigationMessage message) {
  189.         final int    gpsPRN = message.getPRN();
  190.         final String prnString = gpsPRN < 10 ? "0" + gpsPRN : String.valueOf(gpsPRN);
  191.         final String satId = SatelliteSystem.GPS.getKey() + prnString;
  192.         gpsLegacyData.putIfAbsent(satId, new ArrayList<>());
  193.         gpsLegacyData.get(satId).add(message);
  194.     }

  195.     /**
  196.      * Get all the GPS civilian navigation messages contained in the file.
  197.      * @return an unmodifiable list of GPS civilian navigation messages
  198.      * @since 12.0
  199.      */
  200.     public Map<String, List<GPSCivilianNavigationMessage>> getGPSCivilianNavigationMessages() {
  201.         return Collections.unmodifiableMap(gpsCivilianData);
  202.     }

  203.     /**
  204.      * Get the GPS civilian navigation messages for the given satellite Id.
  205.      * @param satId satellite Id (i.e. Satellite System (e.g. G) + satellite number)
  206.      * @return an unmodifiable list of GPS civilian navigation messages
  207.      * @since 12.0
  208.      */
  209.     public List<GPSCivilianNavigationMessage> getGPSCivilianNavigationMessages(final String satId) {
  210.         return Collections.unmodifiableList(gpsCivilianData.get(satId));
  211.     }

  212.     /**
  213.      * Add a GPS civilian navigation message to the list.
  214.      * @param message message to add
  215.      * @since 13.0
  216.      */
  217.     public void addGPSCivilianNavigationMessage(final GPSCivilianNavigationMessage message) {
  218.         final int    gpsPRN = message.getPRN();
  219.         final String prnString = gpsPRN < 10 ? "0" + gpsPRN : String.valueOf(gpsPRN);
  220.         final String satId = SatelliteSystem.GPS.getKey() + prnString;
  221.         gpsCivilianData.putIfAbsent(satId, new ArrayList<>());
  222.         gpsCivilianData.get(satId).add(message);
  223.     }

  224.     /**
  225.      * Get all the Galileo navigation messages contained in the file.
  226.      * @return an unmodifiable list of Galileo navigation messages
  227.      */
  228.     public Map<String, List<GalileoNavigationMessage>> getGalileoNavigationMessages() {
  229.         return Collections.unmodifiableMap(galileoData);
  230.     }

  231.     /**
  232.      * Get the Galileo navigation messages for the given satellite Id.
  233.      * @param satId satellite Id (i.e. Satellite System (e.g. E) + satellite number)
  234.      * @return an unmodifiable list of Galileo navigation messages
  235.      */
  236.     public List<GalileoNavigationMessage> getGalileoNavigationMessages(final String satId) {
  237.         return Collections.unmodifiableList(galileoData.get(satId));
  238.     }

  239.     /**
  240.      * Add a Galileo navigation message to the list.
  241.      * @param message message to add
  242.      */
  243.     public void addGalileoNavigationMessage(final GalileoNavigationMessage message) {
  244.         final int    galPRN = message.getPRN();
  245.         final String prnString = galPRN < 10 ? "0" + galPRN : String.valueOf(galPRN);
  246.         final String satId = SatelliteSystem.GALILEO.getKey() + prnString;
  247.         galileoData.putIfAbsent(satId, new ArrayList<>());
  248.         galileoData.get(satId).add(message);
  249.     }

  250.     /**
  251.      * Get all the Beidou navigation messages contained in the file.
  252.      * @return an unmodifiable list of Beidou navigation messages
  253.      * @since 12.0
  254.      */
  255.     public Map<String, List<BeidouLegacyNavigationMessage>> getBeidouLegacyNavigationMessages() {
  256.         return Collections.unmodifiableMap(beidouLegacyData);
  257.     }

  258.     /**
  259.      * Get the Beidou navigation messages for the given satellite Id.
  260.      * @param satId satellite Id (i.e. Satellite System (e.g. C) + satellite number)
  261.      * @return an unmodifiable list of Beidou navigation messages
  262.      * @since 12.0
  263.      */
  264.     public List<BeidouLegacyNavigationMessage> getBeidouLegacyNavigationMessages(final String satId) {
  265.         return Collections.unmodifiableList(beidouLegacyData.get(satId));
  266.     }

  267.     /**
  268.      * Add a Beidou navigation message to the list.
  269.      * @param message message to add
  270.      * @since 12.0
  271.      */
  272.     public void addBeidouLegacyNavigationMessage(final BeidouLegacyNavigationMessage message) {
  273.         final int    bdtPRN = message.getPRN();
  274.         final String prnString = bdtPRN < 10 ? "0" + bdtPRN : String.valueOf(bdtPRN);
  275.         final String satId = SatelliteSystem.BEIDOU.getKey() + prnString;
  276.         beidouLegacyData.putIfAbsent(satId, new ArrayList<>());
  277.         beidouLegacyData.get(satId).add(message);
  278.     }

  279.     /**
  280.      * Get all the Beidou navigation messages contained in the file.
  281.      * @return an unmodifiable list of Beidou navigation messages
  282.      * @since 12.0
  283.      */
  284.     public Map<String, List<BeidouCivilianNavigationMessage>> getBeidouCivilianNavigationMessages() {
  285.         return Collections.unmodifiableMap(beidouCivilianData);
  286.     }

  287.     /**
  288.      * Get the Beidou navigation messages for the given satellite Id.
  289.      * @param satId satellite Id (i.e. Satellite System (e.g. C) + satellite number)
  290.      * @return an unmodifiable list of Beidou navigation messages
  291.      * @since 12.0
  292.      */
  293.     public List<BeidouCivilianNavigationMessage> getBeidouCivilianNavigationMessages(final String satId) {
  294.         return Collections.unmodifiableList(beidouCivilianData.get(satId));
  295.     }

  296.     /**
  297.      * Add a Beidou navigation message to the list.
  298.      * @param message message to add
  299.      * @since 12.0
  300.      */
  301.     public void addBeidouCivilianNavigationMessage(final BeidouCivilianNavigationMessage message) {
  302.         final int    bdtPRN = message.getPRN();
  303.         final String prnString = bdtPRN < 10 ? "0" + bdtPRN : String.valueOf(bdtPRN);
  304.         final String satId = SatelliteSystem.BEIDOU.getKey() + prnString;
  305.         beidouCivilianData.putIfAbsent(satId, new ArrayList<>());
  306.         beidouCivilianData.get(satId).add(message);
  307.     }

  308.     /**
  309.      * Get all the QZSS navigation messages contained in the file.
  310.      * @return an unmodifiable list of QZSS navigation messages
  311.      * @since 12.0
  312.      */
  313.     public Map<String, List<QZSSLegacyNavigationMessage>> getQZSSLegacyNavigationMessages() {
  314.         return Collections.unmodifiableMap(qzssLegacyData);
  315.     }

  316.     /**
  317.      * Get the QZSS navigation messages for the given satellite Id.
  318.      * @param satId satellite Id (i.e. Satellite System (e.g. J) + satellite number)
  319.      * @return an unmodifiable list of QZSS navigation messages
  320.      * @since 12.0
  321.      */
  322.     public List<QZSSLegacyNavigationMessage> getQZSSLegacyNavigationMessages(final String satId) {
  323.         return Collections.unmodifiableList(qzssLegacyData.get(satId));
  324.     }

  325.     /**
  326.      * Add a QZSS navigation message to the list.
  327.      * @param message message to add
  328.      * @since 12.0
  329.      */
  330.     public void addQZSSLegacyNavigationMessage(final QZSSLegacyNavigationMessage message) {
  331.         final int    qzsPRN = message.getPRN();
  332.         final String prnString = qzsPRN < 10 ? "0" + qzsPRN : String.valueOf(qzsPRN);
  333.         final String satId = SatelliteSystem.QZSS.getKey() + prnString;
  334.         qzssLegacyData.putIfAbsent(satId, new ArrayList<>());
  335.         qzssLegacyData.get(satId).add(message);
  336.     }

  337.     /**
  338.      * Get all the QZSS navigation messages contained in the file.
  339.      * @return an unmodifiable list of QZSS navigation messages
  340.      * @since 12.0
  341.      */
  342.     public Map<String, List<QZSSCivilianNavigationMessage>> getQZSSCivilianNavigationMessages() {
  343.         return Collections.unmodifiableMap(qzssCivilianData);
  344.     }

  345.     /**
  346.      * Get the QZSS navigation messages for the given satellite Id.
  347.      * @param satId satellite Id (i.e. Satellite System (e.g. J) + satellite number)
  348.      * @return an unmodifiable list of QZSS navigation messages
  349.      * @since 12.0
  350.      */
  351.     public List<QZSSCivilianNavigationMessage> getQZSSCivilianNavigationMessages(final String satId) {
  352.         return Collections.unmodifiableList(qzssCivilianData.get(satId));
  353.     }

  354.     /**
  355.      * Add a QZSS navigation message to the list.
  356.      * @param message message to add
  357.      * @since 12.0
  358.      */
  359.     public void addQZSSCivilianNavigationMessage(final QZSSCivilianNavigationMessage message) {
  360.         final int    qzsPRN = message.getPRN();
  361.         final String prnString = qzsPRN < 10 ? "0" + qzsPRN : String.valueOf(qzsPRN);
  362.         final String satId = SatelliteSystem.QZSS.getKey() + prnString;
  363.         qzssCivilianData.putIfAbsent(satId, new ArrayList<>());
  364.         qzssCivilianData.get(satId).add(message);
  365.     }

  366.     /**
  367.      * Get all the NavIC navigation messages contained in the file.
  368.      * @return an unmodifiable list of NavIC navigation messages
  369.      */
  370.     public Map<String, List<NavICLegacyNavigationMessage>> getNavICLegacyNavigationMessages() {
  371.         return Collections.unmodifiableMap(navicLegacyData);
  372.     }

  373.     /**
  374.      * Get the NavIC navigation messages for the given satellite Id.
  375.      * @param satId satellite Id (i.e. Satellite System (e.g. I) + satellite number)
  376.      * @return an unmodifiable list of NavIC navigation messages
  377.      */
  378.     public List<NavICLegacyNavigationMessage> getNavICLegacyNavigationMessages(final String satId) {
  379.         return Collections.unmodifiableList(navicLegacyData.get(satId));
  380.     }

  381.     /**
  382.      * Add a NavIC navigation message to the list.
  383.      * @param message message to add
  384.      */
  385.     public void addNavICLegacyNavigationMessage(final NavICLegacyNavigationMessage message) {
  386.         final int    irsPRN = message.getPRN();
  387.         final String prnString = irsPRN < 10 ? "0" + irsPRN : String.valueOf(irsPRN);
  388.         final String satId = SatelliteSystem.NAVIC.getKey() + prnString;
  389.         navicLegacyData.putIfAbsent(satId, new ArrayList<>());
  390.         navicLegacyData.get(satId).add(message);
  391.     }

  392.     /**
  393.      * Get all the NavIC navigation messages contained in the file.
  394.      * @return an unmodifiable list of NavIC navigation messages
  395.      */
  396.     public Map<String, List<NavICL1NVNavigationMessage>> getNavICL1NVNavigationMessages() {
  397.         return Collections.unmodifiableMap(navicL1NVData);
  398.     }

  399.     /**
  400.      * Get the NavIC navigation messages for the given satellite Id.
  401.      * @param satId satellite Id (i.e. Satellite System (e.g. I) + satellite number)
  402.      * @return an unmodifiable list of NavIC navigation messages
  403.      */
  404.     public List<NavICL1NVNavigationMessage> getNavICL1NVNavigationMessages(final String satId) {
  405.         return Collections.unmodifiableList(navicL1NVData.get(satId));
  406.     }

  407.     /**
  408.      * Add a NavIC navigation message to the list.
  409.      * @param message message to add
  410.      */
  411.     public void addNavICL1NVNavigationMessage(final NavICL1NVNavigationMessage message) {
  412.         final int    irsPRN = message.getPRN();
  413.         final String prnString = irsPRN < 10 ? "0" + irsPRN : String.valueOf(irsPRN);
  414.         final String satId = SatelliteSystem.NAVIC.getKey() + prnString;
  415.         navicL1NVData.putIfAbsent(satId, new ArrayList<>());
  416.         navicL1NVData.get(satId).add(message);
  417.     }

  418.     /**
  419.      * Get all the Glonass navigation messages contained in the file.
  420.      * @return an unmodifiable list of Glonass navigation messages
  421.      */
  422.     public Map<String, List<GLONASSNavigationMessage>> getGlonassNavigationMessages() {
  423.         return Collections.unmodifiableMap(glonassData);
  424.     }

  425.     /**
  426.      * Get the Glonass navigation messages for the given satellite Id.
  427.      * @param satId satellite Id (i.e. Satellite System (e.g. R) + satellite number)
  428.      * @return an unmodifiable list of Glonass navigation messages
  429.      */
  430.     public List<GLONASSNavigationMessage> getGlonassNavigationMessages(final String satId) {
  431.         return Collections.unmodifiableList(glonassData.get(satId));
  432.     }

  433.     /**
  434.      * Add a Glonass navigation message to the list.
  435.      * @param message message to add
  436.      */
  437.     public void addGlonassNavigationMessage(final GLONASSNavigationMessage message) {
  438.         final int    gloPRN = message.getPRN();
  439.         final String prnString = gloPRN < 10 ? "0" + gloPRN : String.valueOf(gloPRN);
  440.         final String satId = SatelliteSystem.GLONASS.getKey() + prnString;
  441.         glonassData.putIfAbsent(satId, new ArrayList<>());
  442.         glonassData.get(satId).add(message);
  443.     }

  444.     /**
  445.      * Get all the SBAS navigation messages contained in the file.
  446.      * @return an unmodifiable list of SBAS navigation messages
  447.      */
  448.     public Map<String, List<SBASNavigationMessage>> getSBASNavigationMessages() {
  449.         return Collections.unmodifiableMap(sbasData);
  450.     }

  451.     /**
  452.      * Get the SBAS navigation messages for the given satellite Id.
  453.      * @param satId satellite Id (i.e. Satellite System (e.g. S) + satellite number)
  454.      * @return an unmodifiable list of SBAS navigation messages
  455.      */
  456.     public List<SBASNavigationMessage> getSBASNavigationMessages(final String satId) {
  457.         return Collections.unmodifiableList(sbasData.get(satId));
  458.     }

  459.     /**
  460.      * Add a SBAS navigation message to the list.
  461.      * @param message message to add
  462.      */
  463.     public void addSBASNavigationMessage(final SBASNavigationMessage message) {
  464.         final int    sbsPRN = message.getPRN();
  465.         final String prnString = sbsPRN < 10 ? "0" + sbsPRN : String.valueOf(sbsPRN);
  466.         final String satId = SatelliteSystem.SBAS.getKey() + prnString;
  467.         sbasData.putIfAbsent(satId, new ArrayList<>());
  468.         sbasData.get(satId).add(message);
  469.     }

  470.     /**
  471.      * Get the system time offsets.
  472.      * @return an unmodifiable list of system time offsets
  473.      * @since 12.0
  474.      */
  475.     public List<SystemTimeOffsetMessage> getSystemTimeOffsets() {
  476.         return Collections.unmodifiableList(systemTimeOffsets);
  477.     }

  478.     /**
  479.      * Add a system time offset.
  480.      * @param systemTimeOffset system time offset message
  481.      * @since 12.0
  482.      */
  483.     public void addSystemTimeOffset(final SystemTimeOffsetMessage systemTimeOffset) {
  484.         systemTimeOffsets.add(systemTimeOffset);
  485.     }

  486.     /**
  487.      * Get the Earth orientation parameters.
  488.      * @return an unmodifiable list of Earth orientation parameters
  489.      * @since 12.0
  490.      */
  491.     public List<EarthOrientationParameterMessage> getEarthOrientationParameters() {
  492.         return Collections.unmodifiableList(eops);
  493.     }

  494.     /**
  495.      * Add an Earth orientation parameter.
  496.      * @param eop Earth orientation oarameter message
  497.      * @since 12.0
  498.      */
  499.     public void addEarthOrientationParameter(final EarthOrientationParameterMessage eop) {
  500.         eops.add(eop);
  501.     }

  502.     /**
  503.      * Get the ionosphere Klobuchar messages.
  504.      * @return an unmodifiable list of ionosphere Klobuchar messages
  505.      * @since 12.0
  506.      */
  507.     public List<IonosphereKlobucharMessage> getKlobucharMessages() {
  508.         return Collections.unmodifiableList(klobucharMessages);
  509.     }

  510.     /**
  511.      * Add an ionosphere Klobuchar message.
  512.      * @param klobuchar ionosphere Klobuchar message
  513.      * @since 12.0
  514.      */
  515.     public void addKlobucharMessage(final IonosphereKlobucharMessage klobuchar) {
  516.         klobucharMessages.add(klobuchar);
  517.     }

  518.     /**
  519.      * Get the ionosphere Nequick-G messages.
  520.      * @return an unmodifiable list of ionosphere Nequick-G messages
  521.      * @since 12.0
  522.      */
  523.     public List<IonosphereNequickGMessage> getNequickGMessages() {
  524.         return Collections.unmodifiableList(nequickGMessages);
  525.     }

  526.     /**
  527.      * Add an ionosphere Nequick-G message.
  528.      * @param nequickG ionosphere Nequick-G message
  529.      * @since 12.0
  530.      */
  531.     public void addNequickGMessage(final IonosphereNequickGMessage nequickG) {
  532.         nequickGMessages.add(nequickG);
  533.     }

  534.     /**
  535.      * Get the ionosphere BDGIM messages.
  536.      * @return an unmodifiable list of ionosphere BDGIM messages
  537.      * @since 12.0
  538.      */
  539.     public List<IonosphereBDGIMMessage> getBDGIMMessages() {
  540.         return Collections.unmodifiableList(bdgimMessages);
  541.     }

  542.     /**
  543.      * Add an ionosphere BDGIM message.
  544.      * @param bdgim ionosphere BDGIM message
  545.      * @since 12.0
  546.      */
  547.     public void addBDGIMMessage(final IonosphereBDGIMMessage bdgim) {
  548.         bdgimMessages.add(bdgim);
  549.     }

  550. }