1   /* Copyright 2002-2026 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.parsers.ephemeris;
18  
19  import org.orekit.errors.OrekitException;
20  import org.orekit.errors.OrekitMessages;
21  import org.orekit.files.rinex.navigation.RinexNavigation;
22  import org.orekit.files.rinex.navigation.RinexNavigationParser;
23  import org.orekit.files.rinex.navigation.parsers.ParseInfo;
24  import org.orekit.propagation.analytical.gnss.data.BeidouCivilianNavigationMessage;
25  import org.orekit.propagation.analytical.gnss.data.BeidouCivilianNavigationMessageFactory;
26  import org.orekit.propagation.analytical.gnss.data.BeidouCivilianType;
27  import org.orekit.propagation.analytical.gnss.data.BeidouSatelliteType;
28  import org.orekit.time.GNSSDate;
29  import org.orekit.utils.units.Unit;
30  
31  /** Parser for Beidou-3 CNAV.
32   * @author Bryan Cazabonne
33   * @author Luc Maisonobe
34   * @since 14.0
35   */
36  public class BeidouCnv123Parser
37          extends AbstractNavigationParser<BeidouCivilianNavigationMessage, BeidouCivilianNavigationMessageFactory> {
38  
39      /** Simple constructor.
40       * @param parseInfo container for parsing data
41       * @param factory factory for navigation message
42       */
43      public BeidouCnv123Parser(final ParseInfo parseInfo, final BeidouCivilianNavigationMessageFactory factory) {
44          super(parseInfo, factory);
45      }
46  
47      /** {@inheritDoc} */
48      @Override
49      public void parseLine00() {
50          final ParseInfo parseInfo = getParseInfo();
51          final BeidouCivilianNavigationMessageFactory factory = getFactory();
52          parseSvEpochSvClockLine(parseInfo.getTimeScales().getBDT(), parseInfo, factory);
53      }
54  
55      /** {@inheritDoc} */
56      @Override
57      public void parseLine01() {
58          super.parseLine01();
59          final BeidouCivilianNavigationMessageFactory factory = getFactory();
60          factory.getADotDriver().setValue(getParseInfo().parseDouble1(RinexNavigationParser.M_PER_S));
61      }
62  
63      /** {@inheritDoc} */
64      @Override
65      public void parseLine05() {
66          final ParseInfo parseInfo = getParseInfo();
67          final BeidouCivilianNavigationMessageFactory factory = getFactory();
68          factory.getIDotDriver().setValue(parseInfo.parseDouble1(RinexNavigationParser.RAD_PER_S));
69          factory.getDeltaN0DotDriver().setValue(parseInfo.parseDouble2(RinexNavigationParser.RAD_PER_S2));
70          try {
71              factory.setSatelliteType(BeidouSatelliteType.parseSatelliteType(parseInfo.parseInt3()));
72          } catch (IllegalArgumentException iae) {
73              throw new OrekitException(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
74                                        parseInfo.getLineNumber(), parseInfo.getName(),
75                                        parseInfo.getLine());
76          }
77          factory.getTimeDriver().setValue(parseInfo.parseDouble4(Unit.SECOND));
78      }
79  
80      /** {@inheritDoc} */
81      @Override
82      public void parseLine06() {
83          final ParseInfo parseInfo = getParseInfo();
84          final BeidouCivilianNavigationMessageFactory factory = getFactory();
85          factory.setSisaiOe(parseInfo.parseInt1());
86          factory.setSisaiOcb(parseInfo.parseInt2());
87          factory.setSisaiOc1(parseInfo.parseInt3());
88          factory.setSisaiOc2(parseInfo.parseInt4());
89      }
90  
91      /** {@inheritDoc} */
92      @Override
93      public void parseLine07() {
94          final ParseInfo parseInfo = getParseInfo();
95          final BeidouCivilianNavigationMessageFactory factory = getFactory();
96          if (factory.getBeidouType() == BeidouCivilianType.CNV1) {
97              factory.setIscB1CD(parseInfo.parseDouble1(Unit.SECOND));
98              // field 2 is spare
99              factory.setTgdB1Cp(parseInfo.parseDouble3(Unit.SECOND));
100             factory.setTgdB2ap(parseInfo.parseDouble4(Unit.SECOND));
101         } else if (factory.getBeidouType() == BeidouCivilianType.CNV2) {
102             // field 1 is spare
103             factory.setIscB2AD(parseInfo.parseDouble2(Unit.SECOND));
104             factory.setTgdB1Cp(parseInfo.parseDouble3(Unit.SECOND));
105             factory.setTgdB2ap(parseInfo.parseDouble4(Unit.SECOND));
106         } else {
107             parseSismaiHealthIntegrity();
108         }
109     }
110 
111     /** {@inheritDoc} */
112     @Override
113     public void parseLine08() {
114         final ParseInfo parseInfo = getParseInfo();
115         final BeidouCivilianNavigationMessageFactory factory = getFactory();
116         if (factory.getBeidouType() == BeidouCivilianType.CNV3) {
117             factory.setTransmissionTime(new GNSSDate(factory.getTimeOfEphemeris().getWeekNumber(),
118                                                      parseInfo.parseDouble1(Unit.SECOND),
119                                                      factory.getSystem()));
120             parseInfo.closePendingRecord();
121         } else {
122             parseSismaiHealthIntegrity();
123         }
124     }
125 
126     /** {@inheritDoc} */
127     @Override
128     public void parseLine09() {
129         final ParseInfo parseInfo = getParseInfo();
130         final BeidouCivilianNavigationMessageFactory factory = getFactory();
131         factory.setTransmissionTime(new GNSSDate(factory.getTimeOfEphemeris().getWeekNumber(),
132                                                  parseInfo.parseDouble1(Unit.SECOND),
133                                                  factory.getSystem()));
134         // field 2 is spare
135         // field 3 is spare
136         factory.setIode(parseInfo.parseInt4());
137         parseInfo.closePendingRecord();
138     }
139 
140     /** {@inheritDoc} */
141     @Override
142     public void closeRecord(final RinexNavigation file) {
143         file.addBeidouCivilianNavigationMessage(getMessage());
144     }
145 
146     /**
147      * Parse the SISMAI/Health/integrity line.
148      */
149     private void parseSismaiHealthIntegrity() {
150         final ParseInfo parseInfo = getParseInfo();
151         final BeidouCivilianNavigationMessageFactory factory = getFactory();
152         factory.setSismai(parseInfo.parseInt1());
153         factory.setHealth(parseInfo.parseInt2());
154         factory.setIntegrityFlags(parseInfo.parseInt3());
155         factory.setIodc(parseInfo.parseInt4());
156     }
157 
158 }