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