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  
19  import java.util.ArrayList;
20  import java.util.Collections;
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.orekit.files.rinex.RinexFile;
26  import org.orekit.gnss.SatelliteSystem;
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.GLONASSFdmaNavigationMessage;
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  /**
40   * Represents a parsed RINEX navigation messages files.
41   * @author Bryan Cazabonne
42   * @author Luc Maisonobe
43   * @since 11.0
44   */
45  public class RinexNavigation extends RinexFile<RinexNavigationHeader> {
46  
47      /** A map containing the GPS navigation messages. */
48      private final Map<String, List<GPSLegacyNavigationMessage>> gpsLegacyData;
49  
50      /** A map containing the GPS navigation messages. */
51      private final Map<String, List<GPSCivilianNavigationMessage>> gpsCivilianData;
52  
53      /** A map containing the Galileo navigation messages. */
54      private final Map<String, List<GalileoNavigationMessage>> galileoData;
55  
56      /** A map containing the Beidou navigation messages. */
57      private final Map<String, List<BeidouLegacyNavigationMessage>> beidouLegacyData;
58  
59      /** A map containing the Beidou navigation messages. */
60      private final Map<String, List<BeidouCivilianNavigationMessage>> beidouCivilianData;
61  
62      /** A map containing the QZSS navigation messages. */
63      private final Map<String, List<QZSSLegacyNavigationMessage>> qzssLegacyData;
64  
65      /** A map containing the QZSS navigation messages. */
66      private final Map<String, List<QZSSCivilianNavigationMessage>> qzssCivilianData;
67  
68      /** A map containing the NavIC navigation messages. */
69      private final Map<String, List<NavICLegacyNavigationMessage>> navicLegacyData;
70  
71      /** A map containing the NavIC navigation messages.
72       * @since 13.0
73       */
74      private final Map<String, List<NavICL1NvNavigationMessage>> navicL1NVData;
75  
76      /** A map containing the GLONASS navigation messages. */
77      private final Map<String, List<GLONASSFdmaNavigationMessage>> glonassData;
78  
79      /** A map containing the SBAS navigation messages. */
80      private final Map<String, List<SBASNavigationMessage>> sbasData;
81  
82      /** System time offsets.
83       * @since 12.0
84       */
85      private final List<SystemTimeOffsetMessage> systemTimeOffsets;
86  
87      /** Earth orientation parameters.
88       * @since 12.0
89       */
90      private final List<EarthOrientationParameterMessage> eops;
91  
92      /** Ionosphere Klobuchar messages.
93       * @since 12.0
94       */
95      private final List<IonosphereKlobucharMessage> klobucharMessages;
96  
97      /** Ionosphere Nequick G messages.
98       * @since 12.0
99       */
100     private final List<IonosphereNequickGMessage> nequickGMessages;
101 
102     /** Ionosphere BDGIM messages.
103      * @since 12.0
104      */
105     private final List<IonosphereBDGIMMessage> bdgimMessages;
106 
107     /** Ionosphere NavIC Klobuchar messages.
108      * @since 14.0
109      */
110     private final List<IonosphereNavICKlobucharMessage> navICKlobucharMessages;
111 
112     /** Ionosphere NavIC NeQuick N messages.
113      * @since 14.0
114      */
115     private final List<IonosphereNavICNeQuickNMessage> navICNeQuickNMessages;
116 
117     /** Ionosphere GLONASS CDMS messages.
118      * @since 14.0
119      */
120     private final List<IonosphereGlonassCdmsMessage> glonassCDMSMessages;
121 
122     /** Constructor. */
123     public RinexNavigation() {
124         super(new RinexNavigationHeader());
125         this.gpsLegacyData          = new HashMap<>();
126         this.gpsCivilianData        = new HashMap<>();
127         this.galileoData            = new HashMap<>();
128         this.beidouLegacyData       = new HashMap<>();
129         this.beidouCivilianData     = new HashMap<>();
130         this.qzssLegacyData         = new HashMap<>();
131         this.qzssCivilianData       = new HashMap<>();
132         this.navicLegacyData        = new HashMap<>();
133         this.navicL1NVData          = new HashMap<>();
134         this.glonassData            = new HashMap<>();
135         this.sbasData               = new HashMap<>();
136         this.systemTimeOffsets      = new ArrayList<>();
137         this.eops                   = new ArrayList<>();
138         this.klobucharMessages      = new ArrayList<>();
139         this.nequickGMessages       = new ArrayList<>();
140         this.bdgimMessages          = new ArrayList<>();
141         this.navICKlobucharMessages = new ArrayList<>();
142         this.navICNeQuickNMessages  = new ArrayList<>();
143         this.glonassCDMSMessages    = new ArrayList<>();
144     }
145 
146     /**
147      * Get all the GPS legacy navigation messages contained in the file.
148      * @return an unmodifiable list of GPS legacy navigation messages
149      * @since 12.0
150      */
151     public Map<String, List<GPSLegacyNavigationMessage>> getGPSLegacyNavigationMessages() {
152         return Collections.unmodifiableMap(gpsLegacyData);
153     }
154 
155     /**
156      * Get the GPS legacy navigation messages for the given satellite Id.
157      * @param satId satellite Id (i.e. Satellite System (e.g. G) + satellite number)
158      * @return an unmodifiable list of GPS legacy navigation messages
159      * @since 12.0
160      */
161     public List<GPSLegacyNavigationMessage> getGPSLegacyNavigationMessages(final String satId) {
162         return Collections.unmodifiableList(gpsLegacyData.get(satId));
163     }
164 
165     /**
166      * Add a GPS legacy navigation message to the list.
167      * @param message message to add
168      * @since 12.0
169      */
170     public void addGPSLegacyNavigationMessage(final GPSLegacyNavigationMessage message) {
171         final int    gpsPRN = message.getPRN();
172         final String prnString = gpsPRN < 10 ? "0" + gpsPRN : String.valueOf(gpsPRN);
173         final String satId = SatelliteSystem.GPS.getKey() + prnString;
174         gpsLegacyData.putIfAbsent(satId, new ArrayList<>());
175         gpsLegacyData.get(satId).add(message);
176     }
177 
178     /**
179      * Get all the GPS civilian navigation messages contained in the file.
180      * @return an unmodifiable list of GPS civilian navigation messages
181      * @since 12.0
182      */
183     public Map<String, List<GPSCivilianNavigationMessage>> getGPSCivilianNavigationMessages() {
184         return Collections.unmodifiableMap(gpsCivilianData);
185     }
186 
187     /**
188      * Get the GPS civilian navigation messages for the given satellite Id.
189      * @param satId satellite Id (i.e. Satellite System (e.g. G) + satellite number)
190      * @return an unmodifiable list of GPS civilian navigation messages
191      * @since 12.0
192      */
193     public List<GPSCivilianNavigationMessage> getGPSCivilianNavigationMessages(final String satId) {
194         return Collections.unmodifiableList(gpsCivilianData.get(satId));
195     }
196 
197     /**
198      * Add a GPS civilian navigation message to the list.
199      * @param message message to add
200      * @since 13.0
201      */
202     public void addGPSCivilianNavigationMessage(final GPSCivilianNavigationMessage message) {
203         final int    gpsPRN = message.getPRN();
204         final String prnString = gpsPRN < 10 ? "0" + gpsPRN : String.valueOf(gpsPRN);
205         final String satId = SatelliteSystem.GPS.getKey() + prnString;
206         gpsCivilianData.putIfAbsent(satId, new ArrayList<>());
207         gpsCivilianData.get(satId).add(message);
208     }
209 
210     /**
211      * Get all the Galileo navigation messages contained in the file.
212      * @return an unmodifiable list of Galileo navigation messages
213      */
214     public Map<String, List<GalileoNavigationMessage>> getGalileoNavigationMessages() {
215         return Collections.unmodifiableMap(galileoData);
216     }
217 
218     /**
219      * Get the Galileo navigation messages for the given satellite Id.
220      * @param satId satellite Id (i.e. Satellite System (e.g. E) + satellite number)
221      * @return an unmodifiable list of Galileo navigation messages
222      */
223     public List<GalileoNavigationMessage> getGalileoNavigationMessages(final String satId) {
224         return Collections.unmodifiableList(galileoData.get(satId));
225     }
226 
227     /**
228      * Add a Galileo navigation message to the list.
229      * @param message message to add
230      */
231     public void addGalileoNavigationMessage(final GalileoNavigationMessage message) {
232         final int    galPRN = message.getPRN();
233         final String prnString = galPRN < 10 ? "0" + galPRN : String.valueOf(galPRN);
234         final String satId = SatelliteSystem.GALILEO.getKey() + prnString;
235         galileoData.putIfAbsent(satId, new ArrayList<>());
236         galileoData.get(satId).add(message);
237     }
238 
239     /**
240      * Get all the Beidou navigation messages contained in the file.
241      * @return an unmodifiable list of Beidou navigation messages
242      * @since 12.0
243      */
244     public Map<String, List<BeidouLegacyNavigationMessage>> getBeidouLegacyNavigationMessages() {
245         return Collections.unmodifiableMap(beidouLegacyData);
246     }
247 
248     /**
249      * Get the Beidou navigation messages for the given satellite Id.
250      * @param satId satellite Id (i.e. Satellite System (e.g. C) + satellite number)
251      * @return an unmodifiable list of Beidou navigation messages
252      * @since 12.0
253      */
254     public List<BeidouLegacyNavigationMessage> getBeidouLegacyNavigationMessages(final String satId) {
255         return Collections.unmodifiableList(beidouLegacyData.get(satId));
256     }
257 
258     /**
259      * Add a Beidou navigation message to the list.
260      * @param message message to add
261      * @since 12.0
262      */
263     public void addBeidouLegacyNavigationMessage(final BeidouLegacyNavigationMessage message) {
264         final int    bdtPRN = message.getPRN();
265         final String prnString = bdtPRN < 10 ? "0" + bdtPRN : String.valueOf(bdtPRN);
266         final String satId = SatelliteSystem.BEIDOU.getKey() + prnString;
267         beidouLegacyData.putIfAbsent(satId, new ArrayList<>());
268         beidouLegacyData.get(satId).add(message);
269     }
270 
271     /**
272      * Get all the Beidou navigation messages contained in the file.
273      * @return an unmodifiable list of Beidou navigation messages
274      * @since 12.0
275      */
276     public Map<String, List<BeidouCivilianNavigationMessage>> getBeidouCivilianNavigationMessages() {
277         return Collections.unmodifiableMap(beidouCivilianData);
278     }
279 
280     /**
281      * Get the Beidou navigation messages for the given satellite Id.
282      * @param satId satellite Id (i.e. Satellite System (e.g. C) + satellite number)
283      * @return an unmodifiable list of Beidou navigation messages
284      * @since 12.0
285      */
286     public List<BeidouCivilianNavigationMessage> getBeidouCivilianNavigationMessages(final String satId) {
287         return Collections.unmodifiableList(beidouCivilianData.get(satId));
288     }
289 
290     /**
291      * Add a Beidou navigation message to the list.
292      * @param message message to add
293      * @since 12.0
294      */
295     public void addBeidouCivilianNavigationMessage(final BeidouCivilianNavigationMessage message) {
296         final int    bdtPRN = message.getPRN();
297         final String prnString = bdtPRN < 10 ? "0" + bdtPRN : String.valueOf(bdtPRN);
298         final String satId = SatelliteSystem.BEIDOU.getKey() + prnString;
299         beidouCivilianData.putIfAbsent(satId, new ArrayList<>());
300         beidouCivilianData.get(satId).add(message);
301     }
302 
303     /**
304      * Get all the QZSS navigation messages contained in the file.
305      * @return an unmodifiable list of QZSS navigation messages
306      * @since 12.0
307      */
308     public Map<String, List<QZSSLegacyNavigationMessage>> getQZSSLegacyNavigationMessages() {
309         return Collections.unmodifiableMap(qzssLegacyData);
310     }
311 
312     /**
313      * Get the QZSS navigation messages for the given satellite Id.
314      * @param satId satellite Id (i.e. Satellite System (e.g. J) + satellite number)
315      * @return an unmodifiable list of QZSS navigation messages
316      * @since 12.0
317      */
318     public List<QZSSLegacyNavigationMessage> getQZSSLegacyNavigationMessages(final String satId) {
319         return Collections.unmodifiableList(qzssLegacyData.get(satId));
320     }
321 
322     /**
323      * Add a QZSS navigation message to the list.
324      * @param message message to add
325      * @since 12.0
326      */
327     public void addQZSSLegacyNavigationMessage(final QZSSLegacyNavigationMessage message) {
328         final int    qzsPRN = message.getPRN();
329         final String prnString = qzsPRN < 10 ? "0" + qzsPRN : String.valueOf(qzsPRN);
330         final String satId = SatelliteSystem.QZSS.getKey() + prnString;
331         qzssLegacyData.putIfAbsent(satId, new ArrayList<>());
332         qzssLegacyData.get(satId).add(message);
333     }
334 
335     /**
336      * Get all the QZSS navigation messages contained in the file.
337      * @return an unmodifiable list of QZSS navigation messages
338      * @since 12.0
339      */
340     public Map<String, List<QZSSCivilianNavigationMessage>> getQZSSCivilianNavigationMessages() {
341         return Collections.unmodifiableMap(qzssCivilianData);
342     }
343 
344     /**
345      * Get the QZSS navigation messages for the given satellite Id.
346      * @param satId satellite Id (i.e. Satellite System (e.g. J) + satellite number)
347      * @return an unmodifiable list of QZSS navigation messages
348      * @since 12.0
349      */
350     public List<QZSSCivilianNavigationMessage> getQZSSCivilianNavigationMessages(final String satId) {
351         return Collections.unmodifiableList(qzssCivilianData.get(satId));
352     }
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     /**
368      * Get all the NavIC navigation messages contained in the file.
369      * @return an unmodifiable list of NavIC navigation messages
370      */
371     public Map<String, List<NavICLegacyNavigationMessage>> getNavICLegacyNavigationMessages() {
372         return Collections.unmodifiableMap(navicLegacyData);
373     }
374 
375     /**
376      * Get the NavIC navigation messages for the given satellite Id.
377      * @param satId satellite Id (i.e. Satellite System (e.g. I) + satellite number)
378      * @return an unmodifiable list of NavIC navigation messages
379      */
380     public List<NavICLegacyNavigationMessage> getNavICLegacyNavigationMessages(final String satId) {
381         return Collections.unmodifiableList(navicLegacyData.get(satId));
382     }
383 
384     /**
385      * Add a NavIC navigation message to the list.
386      * @param message message to add
387      */
388     public void addNavICLegacyNavigationMessage(final NavICLegacyNavigationMessage message) {
389         final int    irsPRN = message.getPRN();
390         final String prnString = irsPRN < 10 ? "0" + irsPRN : String.valueOf(irsPRN);
391         final String satId = SatelliteSystem.NAVIC.getKey() + prnString;
392         navicLegacyData.putIfAbsent(satId, new ArrayList<>());
393         navicLegacyData.get(satId).add(message);
394     }
395 
396     /**
397      * Get all the NavIC navigation messages contained in the file.
398      * @return an unmodifiable list of NavIC navigation messages
399      */
400     public Map<String, List<NavICL1NvNavigationMessage>> getNavICL1NVNavigationMessages() {
401         return Collections.unmodifiableMap(navicL1NVData);
402     }
403 
404     /**
405      * Get the NavIC navigation messages for the given satellite Id.
406      * @param satId satellite Id (i.e. Satellite System (e.g. I) + satellite number)
407      * @return an unmodifiable list of NavIC navigation messages
408      */
409     public List<NavICL1NvNavigationMessage> getNavICL1NVNavigationMessages(final String satId) {
410         return Collections.unmodifiableList(navicL1NVData.get(satId));
411     }
412 
413     /**
414      * Add a NavIC navigation message to the list.
415      * @param message message to add
416      */
417     public void addNavICL1NVNavigationMessage(final NavICL1NvNavigationMessage message) {
418         final int    irsPRN = message.getPRN();
419         final String prnString = irsPRN < 10 ? "0" + irsPRN : String.valueOf(irsPRN);
420         final String satId = SatelliteSystem.NAVIC.getKey() + prnString;
421         navicL1NVData.putIfAbsent(satId, new ArrayList<>());
422         navicL1NVData.get(satId).add(message);
423     }
424 
425     /**
426      * Get all the Glonass navigation messages contained in the file.
427      * @return an unmodifiable list of Glonass navigation messages
428      */
429     public Map<String, List<GLONASSFdmaNavigationMessage>> getGlonassNavigationMessages() {
430         return Collections.unmodifiableMap(glonassData);
431     }
432 
433     /**
434      * Get the Glonass navigation messages for the given satellite Id.
435      * @param satId satellite Id (i.e. Satellite System (e.g. R) + satellite number)
436      * @return an unmodifiable list of Glonass navigation messages
437      */
438     public List<GLONASSFdmaNavigationMessage> getGlonassNavigationMessages(final String satId) {
439         return Collections.unmodifiableList(glonassData.get(satId));
440     }
441 
442     /**
443      * Add a Glonass navigation message to the list.
444      * @param message message to add
445      */
446     public void addGlonassNavigationMessage(final GLONASSFdmaNavigationMessage message) {
447         final int    gloPRN = message.getPRN();
448         final String prnString = gloPRN < 10 ? "0" + gloPRN : String.valueOf(gloPRN);
449         final String satId = SatelliteSystem.GLONASS.getKey() + prnString;
450         glonassData.putIfAbsent(satId, new ArrayList<>());
451         glonassData.get(satId).add(message);
452     }
453 
454     /**
455      * Get all the SBAS navigation messages contained in the file.
456      * @return an unmodifiable list of SBAS navigation messages
457      */
458     public Map<String, List<SBASNavigationMessage>> getSBASNavigationMessages() {
459         return Collections.unmodifiableMap(sbasData);
460     }
461 
462     /**
463      * Get the SBAS navigation messages for the given satellite Id.
464      * @param satId satellite Id (i.e. Satellite System (e.g. S) + satellite number)
465      * @return an unmodifiable list of SBAS navigation messages
466      */
467     public List<SBASNavigationMessage> getSBASNavigationMessages(final String satId) {
468         return Collections.unmodifiableList(sbasData.get(satId));
469     }
470 
471     /**
472      * Add a SBAS navigation message to the list.
473      * @param message message to add
474      */
475     public void addSBASNavigationMessage(final SBASNavigationMessage message) {
476         final int    sbsPRN = message.getPRN();
477         final String prnString = sbsPRN < 10 ? "0" + sbsPRN : String.valueOf(sbsPRN);
478         final String satId = SatelliteSystem.SBAS.getKey() + prnString;
479         sbasData.putIfAbsent(satId, new ArrayList<>());
480         sbasData.get(satId).add(message);
481     }
482 
483     /**
484      * Get the system time offsets.
485      * @return an unmodifiable list of system time offsets
486      * @since 12.0
487      */
488     public List<SystemTimeOffsetMessage> getSystemTimeOffsets() {
489         return Collections.unmodifiableList(systemTimeOffsets);
490     }
491 
492     /**
493      * Add a system time offset.
494      * @param systemTimeOffset system time offset message
495      * @since 12.0
496      */
497     public void addSystemTimeOffset(final SystemTimeOffsetMessage systemTimeOffset) {
498         systemTimeOffsets.add(systemTimeOffset);
499     }
500 
501     /**
502      * Get the Earth orientation parameters.
503      * @return an unmodifiable list of Earth orientation parameters
504      * @since 12.0
505      */
506     public List<EarthOrientationParameterMessage> getEarthOrientationParameters() {
507         return Collections.unmodifiableList(eops);
508     }
509 
510     /**
511      * Add an Earth orientation parameter.
512      * @param eop Earth orientation oarameter message
513      * @since 12.0
514      */
515     public void addEarthOrientationParameter(final EarthOrientationParameterMessage eop) {
516         eops.add(eop);
517     }
518 
519     /**
520      * Get the ionosphere Klobuchar messages.
521      * @return an unmodifiable list of ionosphere Klobuchar messages
522      * @since 12.0
523      */
524     public List<IonosphereKlobucharMessage> getKlobucharMessages() {
525         return Collections.unmodifiableList(klobucharMessages);
526     }
527 
528     /**
529      * Add an ionosphere Klobuchar message.
530      * @param klobuchar ionosphere Klobuchar message
531      * @since 12.0
532      */
533     public void addKlobucharMessage(final IonosphereKlobucharMessage klobuchar) {
534         klobucharMessages.add(klobuchar);
535     }
536 
537     /**
538      * Get the ionosphere Nequick-G messages.
539      * @return an unmodifiable list of ionosphere Nequick-G messages
540      * @since 12.0
541      */
542     public List<IonosphereNequickGMessage> getNequickGMessages() {
543         return Collections.unmodifiableList(nequickGMessages);
544     }
545 
546     /**
547      * Add an ionosphere Nequick-G message.
548      * @param nequickG ionosphere Nequick-G message
549      * @since 12.0
550      */
551     public void addNequickGMessage(final IonosphereNequickGMessage nequickG) {
552         nequickGMessages.add(nequickG);
553     }
554 
555     /**
556      * Get the ionosphere BDGIM messages.
557      * @return an unmodifiable list of ionosphere BDGIM messages
558      * @since 12.0
559      */
560     public List<IonosphereBDGIMMessage> getBDGIMMessages() {
561         return Collections.unmodifiableList(bdgimMessages);
562     }
563 
564     /**
565      * Add an ionosphere BDGIM message.
566      * @param bdgim ionosphere BDGIM message
567      * @since 12.0
568      */
569     public void addBDGIMMessage(final IonosphereBDGIMMessage bdgim) {
570         bdgimMessages.add(bdgim);
571     }
572 
573     /**
574      * Get the ionosphere NavIC Klobuchar messages.
575      * @return an unmodifiable list of ionosphere NavIC Klobuchar messages
576      * @since 14.0
577      */
578     public List<IonosphereNavICKlobucharMessage> getNavICKlobucharMessages() {
579         return Collections.unmodifiableList(navICKlobucharMessages);
580     }
581 
582     /**
583      * Add an ionosphere NavIC Klobuchar message.
584      * @param navIcKlobuchar ionosphere NavIC Klobuchar message
585      * @since 14.0
586      */
587     public void addNavICKlobucharMessage(final IonosphereNavICKlobucharMessage navIcKlobuchar) {
588         navICKlobucharMessages.add(navIcKlobuchar);
589     }
590 
591     /**
592      * Get the ionosphere NavIC NeQuick N messages.
593      * @return an unmodifiable list of ionosphere NavIC NeQuick N messages
594      * @since 14.0
595      */
596     public List<IonosphereNavICNeQuickNMessage> getNavICNeQuickNMessages() {
597         return Collections.unmodifiableList(navICNeQuickNMessages);
598     }
599 
600     /**
601      * Add an ionosphere NavIC NeQuick N message.
602      * @param navIcNeQuickN ionosphere NavIC NeQuick N message
603      * @since 14.0
604      */
605     public void addNavICNeQuickNMessage(final IonosphereNavICNeQuickNMessage navIcNeQuickN) {
606         navICNeQuickNMessages.add(navIcNeQuickN);
607     }
608 
609     /**
610      * Get the ionosphere GLONASS CDMS messages.
611      * @return an unmodifiable list of ionosphere GLONASS CDMS messages
612      * @since 14.0
613      */
614     public List<IonosphereGlonassCdmsMessage> getGlonassCDMSMessages() {
615         return Collections.unmodifiableList(glonassCDMSMessages);
616     }
617 
618     /**
619      * Add an ionosphere GLONASS CDMS message.
620      * @param glonassCDMS ionosphere GLONASS CDMS message
621      * @since 14.0
622      */
623     public void addGlonassCDMSMessage(final IonosphereGlonassCdmsMessage glonassCDMS) {
624         glonassCDMSMessages.add(glonassCDMS);
625     }
626 
627 }