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