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      /** Change rate in semi-major axis (m/s). */
45      private double aDot;
46  
47      /** Change rate in Δn₀. */
48      private double deltaN0Dot;
49  
50      /** Issue of Data, Ephemeris. */
51      private int iode;
52  
53      /** Issue of Data, Clock. */
54      private int iodc;
55  
56      /** Inter Signal Delay for B1 CD. */
57      private double iscB1CD;
58  
59      /** Inter Signal Delay for B1 CP. */
60      private double iscB1CP;
61  
62      /** Inter Signal Delay for B2 AD. */
63      private double iscB2AD;
64  
65      /** Signal In Space Accuracy Index (along track and across track). */
66      private int sisaiOe;
67  
68      /** Signal In Space Accuracy Index (radial and clock). */
69      private int sisaiOcb;
70  
71      /** Signal In Space Accuracy Index (clock drift accuracy). */
72      private int sisaiOc1;
73  
74      /** Signal In Space Accuracy Index (clock drift rate accuracy). */
75      private int sisaiOc2;
76  
77      /** Signal In Space Monitoring Accuracy Index. */
78      private int sismai;
79  
80      /** Health. */
81      private int health;
82  
83      /** Integrity flags. */
84      private int integrityFlags;
85  
86      /** B1/B3 Group Delay Differential (s). */
87      private double tgdB1Cp;
88  
89      /** B2 AP Group Delay Differential (s). */
90      private double tgdB2ap;
91  
92      /** B2B_i / B3I Group Delay Differential (s). */
93      private double tgdB2bI;
94  
95      /** Satellite type. */
96      private BeidouSatelliteType satelliteType;
97  
98      /**
99       * Constructor.
100      * @param radioWave  radio wave on which navigation signal is sent
101      * @param timeScales known time scales
102      * @param system     satellite system to consider for interpreting week number
103      *                   (may be different from real system, for example in Rinex nav, weeks
104      *                   are always according to GPS)
105      */
106     public BeidouCivilianNavigationMessage(final RadioWave radioWave,
107                                            final TimeScales timeScales, final SatelliteSystem system) {
108         super(GNSSConstants.BEIDOU_MU, GNSSConstants.BEIDOU_AV, GNSSConstants.BEIDOU_WEEK_NB,
109               timeScales, system);
110         this.radioWave = radioWave;
111     }
112 
113     /** Constructor from field instance.
114      * @param <T> type of the field elements
115      * @param original regular field instance
116      */
117     public <T extends CalculusFieldElement<T>> BeidouCivilianNavigationMessage(final FieldBeidouCivilianNavigationMessage<T> original) {
118         super(original);
119         this.radioWave = original.getRadioWave();
120         setADot(original.getADot().getReal());
121         setDeltaN0Dot(original.getDeltaN0Dot().getReal());
122         setIODE(original.getIODE());
123         setIODC(original.getIODC());
124         setIscB1CD(original.getIscB1CD().getReal());
125         setIscB1CP(original.getIscB1CP().getReal());
126         setIscB2AD(original.getIscB2AD().getReal());
127         setSisaiOe(original.getSisaiOe());
128         setSisaiOcb(original.getSisaiOcb());
129         setSisaiOc1(original.getSisaiOc1());
130         setSisaiOc2(original.getSisaiOc2());
131         setSismai(original.getSismai());
132         setHealth(original.getHealth());
133         setIntegrityFlags(original.getIntegrityFlags());
134         setTgdB1Cp(original.getTgdB1Cp().getReal());
135         setTgdB2ap(original.getTgdB2ap().getReal());
136         setTgdB2bI(original.getTgdB2bI().getReal());
137         setSatelliteType(original.getSatelliteType());
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 change rate in semi-major axis.
158      * @return the change rate in semi-major axis
159      */
160     public double getADot() {
161         return aDot;
162     }
163 
164     /**
165      * Setter for the change rate in semi-major axis.
166      * @param value the change rate in semi-major axis
167      */
168     public void setADot(final double value) {
169         this.aDot = value;
170     }
171 
172     /**
173      * Getter for change rate in Δn₀.
174      * @return change rate in Δn₀
175      */
176     public double getDeltaN0Dot() {
177         return deltaN0Dot;
178     }
179 
180     /**
181      * Setter for change rate in Δn₀.
182      * @param deltaN0Dot change rate in Δn₀
183      */
184     public void setDeltaN0Dot(final double deltaN0Dot) {
185         this.deltaN0Dot = deltaN0Dot;
186     }
187 
188     /**
189      * Getter for the Issue Of Data Ephemeris (IODE).
190      * @return the Issue Of Data Ephemeris (IODE)
191      */
192     public int getIODE() {
193         return iode;
194     }
195 
196     /**
197      * Setter for the Issue of Data Ephemeris.
198      * @param value the IODE to set
199      */
200     public void setIODE(final int value) {
201         this.iode = value;
202     }
203 
204     /**
205      * Getter for the Issue Of Data Clock (IODC).
206      * @return the Issue Of Data Clock (IODC)
207      */
208     public int getIODC() {
209         return iodc;
210     }
211 
212     /**
213      * Setter for the Issue of Data Clock.
214      * @param value the IODC to set
215      */
216     public void setIODC(final int value) {
217         this.iodc = value;
218     }
219 
220     /**
221      * Getter for inter Signal Delay for B1 CD.
222      * @return inter signal delay
223      */
224     public double getIscB1CD() {
225         return iscB1CD;
226     }
227 
228     /**
229      * Setter for inter Signal Delay for B1 CD.
230      * @param delay delay to set
231      */
232     public void setIscB1CD(final double delay) {
233         this.iscB1CD = delay;
234     }
235 
236     /**
237      * Getter for inter Signal Delay for B2 AD.
238      * @return inter signal delay
239      */
240     public double getIscB2AD() {
241         return iscB2AD;
242     }
243 
244     /**
245      * Setter for inter Signal Delay for B2 AD.
246      * @param delay delay to set
247      */
248     public void setIscB2AD(final double delay) {
249         this.iscB2AD = delay;
250     }
251 
252     /**
253      * Getter for inter Signal Delay for B1 CP.
254      * @return inter signal delay
255      */
256     public double getIscB1CP() {
257         return iscB1CP;
258     }
259 
260     /**
261      * Setter for inter Signal Delay for B1 CP.
262      * @param delay delay to set
263      */
264     public void setIscB1CP(final double delay) {
265         this.iscB1CP = delay;
266     }
267 
268     /**
269      * Getter for Signal In Space Accuracy Index (along track and across track).
270      * @return Signal In Space Accuracy Index (along track and across track)
271      */
272     public int getSisaiOe() {
273         return sisaiOe;
274     }
275 
276     /**
277      * Setter for Signal In Space Accuracy Index (along track and across track).
278      * @param sisaiOe Signal In Space Accuracy Index (along track and across track)
279      */
280     public void setSisaiOe(final int sisaiOe) {
281         this.sisaiOe = sisaiOe;
282     }
283 
284     /**
285      * Getter for Signal In Space Accuracy Index (radial and clock).
286      * @return Signal In Space Accuracy Index (radial and clock)
287      */
288     public int getSisaiOcb() {
289         return sisaiOcb;
290     }
291 
292     /**
293      * Setter for Signal In Space Accuracy Index (radial and clock).
294      * @param sisaiOcb Signal In Space Accuracy Index (radial and clock)
295      */
296     public void setSisaiOcb(final int sisaiOcb) {
297         this.sisaiOcb = sisaiOcb;
298     }
299 
300     /**
301      * Getter for Signal In Space Accuracy Index (clock drift accuracy).
302      * @return Signal In Space Accuracy Index (clock drift accuracy)
303      */
304     public int getSisaiOc1() {
305         return sisaiOc1;
306     }
307 
308     /**
309      * Setter for Signal In Space Accuracy Index (clock drift accuracy).
310      * @param sisaiOc1 Signal In Space Accuracy Index (clock drift accuracy)
311      */
312     public void setSisaiOc1(final int sisaiOc1) {
313         this.sisaiOc1 = sisaiOc1;
314     }
315 
316     /**
317      * Getter for Signal In Space Accuracy Index (clock drift rate accuracy).
318      * @return Signal In Space Accuracy Index (clock drift rate accuracy)
319      */
320     public int getSisaiOc2() {
321         return sisaiOc2;
322     }
323 
324     /**
325      * Setter for Signal In Space Accuracy Index (clock drift rate accuracy).
326      * @param sisaiOc2 Signal In Space Accuracy Index (clock drift rate accuracy)
327      */
328     public void setSisaiOc2(final int sisaiOc2) {
329         this.sisaiOc2 = sisaiOc2;
330     }
331 
332     /**
333      * Getter for Signal In Space Monitoring Accuracy Index.
334      * @return Signal In Space Monitoring Accuracy Index
335      */
336     public int getSismai() {
337         return sismai;
338     }
339 
340     /**
341      * Setter for Signal In Space Monitoring Accuracy Index.
342      * @param sismai Signal In Space Monitoring Accuracy Index
343      */
344     public void setSismai(final int sismai) {
345         this.sismai = sismai;
346     }
347 
348     /**
349      * Getter for health.
350      * @return health
351      */
352     public int getHealth() {
353         return health;
354     }
355 
356     /**
357      * Setter for health.
358      * @param health health
359      */
360     public void setHealth(final int health) {
361         this.health = health;
362     }
363 
364     /**
365      * Getter for B1C integrity flags.
366      * @return B1C integrity flags
367      */
368     public int getIntegrityFlags() {
369         return integrityFlags;
370     }
371 
372     /**
373      * Setter for B1C integrity flags.
374      * @param integrityFlags integrity flags
375      */
376     public void setIntegrityFlags(final int integrityFlags) {
377         this.integrityFlags = integrityFlags;
378     }
379 
380     /**
381      * Getter for B1/B3 Group Delay Differential (s).
382      * @return B1/B3 Group Delay Differential (s)
383      */
384     public double getTgdB1Cp() {
385         return tgdB1Cp;
386     }
387 
388     /**
389      * Setter for B1/B3 Group Delay Differential (s).
390      * @param tgdB1Cp B1/B3 Group Delay Differential (s)
391      */
392     public void setTgdB1Cp(final double tgdB1Cp) {
393         this.tgdB1Cp = tgdB1Cp;
394     }
395 
396     /**
397      * Getter for B2 AP Group Delay Differential (s).
398      * @return B2 AP Group Delay Differential (s)
399      */
400     public double getTgdB2ap() {
401         return tgdB2ap;
402     }
403 
404     /**
405      * Setter for B2 AP Group Delay Differential (s).
406      * @param tgdB2ap B2 AP Group Delay Differential (s)
407      */
408     public void setTgdB2ap(final double tgdB2ap) {
409         this.tgdB2ap = tgdB2ap;
410     }
411 
412     /**
413      * Getter for B2B_i / B3I Group Delay Differential (s).
414      * @return B2B_i / B3I Group Delay Differential (s)
415      */
416     public double getTgdB2bI() {
417         return tgdB2bI;
418     }
419 
420     /**
421      * Setter for B2B_i / B3I Group Delay Differential (s).
422      * @param tgdB2bI B2B_i / B3I Group Delay Differential (s)
423      */
424     public void setTgdB2bI(final double tgdB2bI) {
425         this.tgdB2bI = tgdB2bI;
426     }
427 
428     /**
429      * Getter for satellite type.
430      * @return satellite type
431      */
432     public BeidouSatelliteType getSatelliteType() {
433         return satelliteType;
434     }
435 
436     /**
437      * Setter for satellite type.
438      * @param satelliteType satellite type
439      */
440     public void setSatelliteType(final BeidouSatelliteType satelliteType) {
441         this.satelliteType = satelliteType;
442     }
443 
444 }