1   /* Copyright 2022-2025 Luc Maisonobe
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.propagation.analytical.gnss.data;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.Field;
21  import org.orekit.gnss.RadioWave;
22  import org.orekit.gnss.SatelliteSystem;
23  import org.orekit.time.TimeScales;
24  
25  /**
26   * Container for data contained in a Beidou civilian navigation message.
27   * @author Luc Maisonobe
28   * @since 12.0
29   */
30  public class BeidouCivilianNavigationMessage extends AbstractNavigationMessage<BeidouCivilianNavigationMessage> {
31  
32      /** Identifier for Beidou-3 B1C message type. */
33      public static final String CNV1 = "CNV1";
34  
35      /** Identifier for Beidou-3 B2A message type. */
36      public static final String CNV2 = "CNV2";
37  
38      /** Identifier for Beidou-3 B2B message type. */
39      public static final String CNV3 = "CNV3";
40  
41      /** Radio wave on which navigation signal is sent. */
42      private final RadioWave radioWave;
43  
44      /** Issue of Data, Ephemeris. */
45      private int iode;
46  
47      /** Issue of Data, Clock. */
48      private int iodc;
49  
50      /** Inter Signal Delay for B1 CD. */
51      private double iscB1CD;
52  
53      /** Inter Signal Delay for B1 CP. */
54      private double iscB1CP;
55  
56      /** Inter Signal Delay for B2 AD. */
57      private double iscB2AD;
58  
59      /** Signal In Space Accuracy Index (along track and across track). */
60      private int sisaiOe;
61  
62      /** Signal In Space Accuracy Index (radial and clock). */
63      private int sisaiOcb;
64  
65      /** Signal In Space Accuracy Index (clock drift accuracy). */
66      private int sisaiOc1;
67  
68      /** Signal In Space Accuracy Index (clock drift rate accuracy). */
69      private int sisaiOc2;
70  
71      /** Signal In Space Monitoring Accuracy Index. */
72      private int sismai;
73  
74      /** Health. */
75      private int health;
76  
77      /** Integrity flags. */
78      private int integrityFlags;
79  
80      /** B1/B3 Group Delay Differential (s). */
81      private double tgdB1Cp;
82  
83      /** B2 AP Group Delay Differential (s). */
84      private double tgdB2ap;
85  
86      /** B2B_i / B3I Group Delay Differential (s). */
87      private double tgdB2bI;
88  
89      /** Satellite type. */
90      private BeidouSatelliteType satelliteType;
91  
92      /**
93       * Constructor.
94       * @param radioWave  radio wave on which navigation signal is sent
95       * @param timeScales known time scales
96       * @param system     satellite system to consider for interpreting week number
97       *                   (may be different from real system, for example in Rinex nav, weeks
98       *                   are always according to GPS)
99       * @param type       message type
100      */
101     public BeidouCivilianNavigationMessage(final RadioWave radioWave,
102                                            final TimeScales timeScales, final SatelliteSystem system,
103                                            final String type) {
104         super(GNSSConstants.BEIDOU_MU, GNSSConstants.BEIDOU_AV, GNSSConstants.BEIDOU_WEEK_NB,
105               timeScales, system, type);
106         this.radioWave = radioWave;
107     }
108 
109     /** Constructor from field instance.
110      * @param <T> type of the field elements
111      * @param original regular field instance
112      */
113     public <T extends CalculusFieldElement<T>> BeidouCivilianNavigationMessage(final FieldBeidouCivilianNavigationMessage<T> original) {
114         super(original);
115         this.radioWave = original.getRadioWave();
116         setIODE(original.getIODE());
117         setIODC(original.getIODC());
118         setIscB1CD(original.getIscB1CD().getReal());
119         setIscB1CP(original.getIscB1CP().getReal());
120         setIscB2AD(original.getIscB2AD().getReal());
121         setSisaiOe(original.getSisaiOe());
122         setSisaiOcb(original.getSisaiOcb());
123         setSisaiOc1(original.getSisaiOc1());
124         setSisaiOc2(original.getSisaiOc2());
125         setSismai(original.getSismai());
126         setHealth(original.getHealth());
127         setIntegrityFlags(original.getIntegrityFlags());
128         setTgdB1Cp(original.getTgdB1Cp().getReal());
129         setTgdB2ap(original.getTgdB2ap().getReal());
130         setTgdB2bI(original.getTgdB2bI().getReal());
131         setSatelliteType(original.getSatelliteType());
132     }
133 
134     /** {@inheritDoc} */
135     @Override
136     public boolean isCivilianMessage() {
137         return true;
138     }
139 
140     /** {@inheritDoc} */
141     @SuppressWarnings("unchecked")
142     @Override
143     public <T extends CalculusFieldElement<T>, F extends FieldGnssOrbitalElements<T, BeidouCivilianNavigationMessage>>
144         F toField(final Field<T> field) {
145         return (F) new FieldBeidouCivilianNavigationMessage<>(field, this);
146     }
147 
148     /**
149      * Getter for radio wave.
150      * @return radio wave on which navigation signal is sent
151      */
152     public RadioWave getRadioWave() {
153         return radioWave;
154     }
155 
156     /**
157      * Getter for the Issue Of Data Ephemeris (IODE).
158      * @return the Issue Of Data Ephemeris (IODE)
159      */
160     public int getIODE() {
161         return iode;
162     }
163 
164     /**
165      * Setter for the Issue of Data Ephemeris.
166      * @param value the IODE to set
167      */
168     public void setIODE(final int value) {
169         this.iode = value;
170     }
171 
172     /**
173      * Getter for the Issue Of Data Clock (IODC).
174      * @return the Issue Of Data Clock (IODC)
175      */
176     public int getIODC() {
177         return iodc;
178     }
179 
180     /**
181      * Setter for the Issue of Data Clock.
182      * @param value the IODC to set
183      */
184     public void setIODC(final int value) {
185         this.iodc = value;
186     }
187 
188     /**
189      * Getter for inter Signal Delay for B1 CD.
190      * @return inter signal delay
191      */
192     public double getIscB1CD() {
193         return iscB1CD;
194     }
195 
196     /**
197      * Setter for inter Signal Delay for B1 CD.
198      * @param delay delay to set
199      */
200     public void setIscB1CD(final double delay) {
201         this.iscB1CD = delay;
202     }
203 
204     /**
205      * Getter for inter Signal Delay for B2 AD.
206      * @return inter signal delay
207      */
208     public double getIscB2AD() {
209         return iscB2AD;
210     }
211 
212     /**
213      * Setter for inter Signal Delay for B2 AD.
214      * @param delay delay to set
215      */
216     public void setIscB2AD(final double delay) {
217         this.iscB2AD = delay;
218     }
219 
220     /**
221      * Getter for inter Signal Delay for B1 CP.
222      * @return inter signal delay
223      */
224     public double getIscB1CP() {
225         return iscB1CP;
226     }
227 
228     /**
229      * Setter for inter Signal Delay for B1 CP.
230      * @param delay delay to set
231      */
232     public void setIscB1CP(final double delay) {
233         this.iscB1CP = delay;
234     }
235 
236     /**
237      * Getter for Signal In Space Accuracy Index (along track and across track).
238      * @return Signal In Space Accuracy Index (along track and across track)
239      */
240     public int getSisaiOe() {
241         return sisaiOe;
242     }
243 
244     /**
245      * Setter for Signal In Space Accuracy Index (along track and across track).
246      * @param sisaiOe Signal In Space Accuracy Index (along track and across track)
247      */
248     public void setSisaiOe(final int sisaiOe) {
249         this.sisaiOe = sisaiOe;
250     }
251 
252     /**
253      * Getter for Signal In Space Accuracy Index (radial and clock).
254      * @return Signal In Space Accuracy Index (radial and clock)
255      */
256     public int getSisaiOcb() {
257         return sisaiOcb;
258     }
259 
260     /**
261      * Setter for Signal In Space Accuracy Index (radial and clock).
262      * @param sisaiOcb Signal In Space Accuracy Index (radial and clock)
263      */
264     public void setSisaiOcb(final int sisaiOcb) {
265         this.sisaiOcb = sisaiOcb;
266     }
267 
268     /**
269      * Getter for Signal In Space Accuracy Index (clock drift accuracy).
270      * @return Signal In Space Accuracy Index (clock drift accuracy)
271      */
272     public int getSisaiOc1() {
273         return sisaiOc1;
274     }
275 
276     /**
277      * Setter for Signal In Space Accuracy Index (clock drift accuracy).
278      * @param sisaiOc1 Signal In Space Accuracy Index (clock drift accuracy)
279      */
280     public void setSisaiOc1(final int sisaiOc1) {
281         this.sisaiOc1 = sisaiOc1;
282     }
283 
284     /**
285      * Getter for Signal In Space Accuracy Index (clock drift rate accuracy).
286      * @return Signal In Space Accuracy Index (clock drift rate accuracy)
287      */
288     public int getSisaiOc2() {
289         return sisaiOc2;
290     }
291 
292     /**
293      * Setter for Signal In Space Accuracy Index (clock drift rate accuracy).
294      * @param sisaiOc2 Signal In Space Accuracy Index (clock drift rate accuracy)
295      */
296     public void setSisaiOc2(final int sisaiOc2) {
297         this.sisaiOc2 = sisaiOc2;
298     }
299 
300     /**
301      * Getter for Signal In Space Monitoring Accuracy Index.
302      * @return Signal In Space Monitoring Accuracy Index
303      */
304     public int getSismai() {
305         return sismai;
306     }
307 
308     /**
309      * Setter for Signal In Space Monitoring Accuracy Index.
310      * @param sismai Signal In Space Monitoring Accuracy Index
311      */
312     public void setSismai(final int sismai) {
313         this.sismai = sismai;
314     }
315 
316     /**
317      * Getter for health.
318      * @return health
319      */
320     public int getHealth() {
321         return health;
322     }
323 
324     /**
325      * Setter for health.
326      * @param health health
327      */
328     public void setHealth(final int health) {
329         this.health = health;
330     }
331 
332     /**
333      * Getter for B1C integrity flags.
334      * @return B1C integrity flags
335      */
336     public int getIntegrityFlags() {
337         return integrityFlags;
338     }
339 
340     /**
341      * Setter for B1C integrity flags.
342      * @param integrityFlags integrity flags
343      */
344     public void setIntegrityFlags(final int integrityFlags) {
345         this.integrityFlags = integrityFlags;
346     }
347 
348     /**
349      * Getter for B1/B3 Group Delay Differential (s).
350      * @return B1/B3 Group Delay Differential (s)
351      */
352     public double getTgdB1Cp() {
353         return tgdB1Cp;
354     }
355 
356     /**
357      * Setter for B1/B3 Group Delay Differential (s).
358      * @param tgdB1Cp B1/B3 Group Delay Differential (s)
359      */
360     public void setTgdB1Cp(final double tgdB1Cp) {
361         this.tgdB1Cp = tgdB1Cp;
362     }
363 
364     /**
365      * Getter for B2 AP Group Delay Differential (s).
366      * @return B2 AP Group Delay Differential (s)
367      */
368     public double getTgdB2ap() {
369         return tgdB2ap;
370     }
371 
372     /**
373      * Setter for B2 AP Group Delay Differential (s).
374      * @param tgdB2ap B2 AP Group Delay Differential (s)
375      */
376     public void setTgdB2ap(final double tgdB2ap) {
377         this.tgdB2ap = tgdB2ap;
378     }
379 
380     /**
381      * Getter for B2B_i / B3I Group Delay Differential (s).
382      * @return B2B_i / B3I Group Delay Differential (s)
383      */
384     public double getTgdB2bI() {
385         return tgdB2bI;
386     }
387 
388     /**
389      * Setter for B2B_i / B3I Group Delay Differential (s).
390      * @param tgdB2bI B2B_i / B3I Group Delay Differential (s)
391      */
392     public void setTgdB2bI(final double tgdB2bI) {
393         this.tgdB2bI = tgdB2bI;
394     }
395 
396     /**
397      * Getter for satellite type.
398      * @return satellite type
399      */
400     public BeidouSatelliteType getSatelliteType() {
401         return satelliteType;
402     }
403 
404     /**
405      * Setter for satellite type.
406      * @param satelliteType satellite type
407      */
408     public void setSatelliteType(final BeidouSatelliteType satelliteType) {
409         this.satelliteType = satelliteType;
410     }
411 
412 }