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 }