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 }