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 }