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