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.gnss;
18
19 import java.util.Locale;
20
21 /** Container for satellite system and PRN.
22 * @author Luc Maisonobe
23 * @since 12.0
24 */
25 public class SatInSystem {
26
27 /** Value representing all PRNs in the system. */
28 public static final int ANY_PRN = -1;
29
30 /** PRN shift for SBAS system. */
31 private static final int SBAS_SHIFT = 100;
32
33 /** PRN shift for QZSS system. */
34 private static final int QZSS_SHIFT = 192;
35
36 /** Satellite system. */
37 private final SatelliteSystem system;
38
39 /** PRN number. */
40 private final int prn;
41
42 /** Simple constructor.
43 * @param system satellite system
44 * @param prn Pseudo Random Number or {@link #ANY_PRN} to represent any satellite in the system
45 */
46 public SatInSystem(final SatelliteSystem system, final int prn) {
47 this.system = system;
48 this.prn = prn;
49 }
50
51 /** Simple constructor.
52 * <p>
53 * The RINEX 3 characters code starts with a letter representing the
54 * {@link SatelliteSystem#getKey() satellite system key} followed
55 * by a 2 digits integer which represents either
56 * </p>
57 * <ul>
58 * <li>the Pseudo Random Number in the general case</li>
59 * <li>the Pseudo Random Number minus 100 for {@link SatelliteSystem#SBAS}</li>
60 * <li>the Pseudo Random Number minus 192 for {@link SatelliteSystem#QZSS}</li>
61 * </ul>
62 * <p>
63 * if only the letter is present, then prn is set to {@link #ANY_PRN}
64 * </p>
65 * @param rinexCode RINEX 3 characters code
66 * @since 13.0
67 */
68 public SatInSystem(final String rinexCode) {
69
70 // parse system
71 this.system = SatelliteSystem.parseSatelliteSystem(rinexCode.substring(0, 1));
72
73 // parse PRN
74 final String trimmed = rinexCode.substring(1).trim();
75 if (trimmed.isEmpty()) {
76 this.prn = ANY_PRN;
77 } else {
78 final int index = Integer.parseInt(trimmed);
79 if (system == SatelliteSystem.SBAS) {
80 this.prn = index + SBAS_SHIFT;
81 } else if (system == SatelliteSystem.QZSS) {
82 this.prn = index + QZSS_SHIFT;
83 } else {
84 this.prn = index;
85 }
86 }
87
88 }
89
90 /** Get the system this satellite belongs to.
91 * @return system this satellite belongs to
92 */
93 public SatelliteSystem getSystem() {
94 return system;
95 }
96
97 /** Get the Pseudo Random Number of the satellite.
98 * @return Pseudo Random Number of the satellite, or {@link #ANY_PRN} to represent
99 * any PRN in the system
100 */
101 public int getPRN() {
102 return prn;
103 }
104
105 /** Get a 2-digits Pseudo Random Number for RINEX files.
106 * @return 2-digits Pseudo Random Number for RINEX files
107 */
108 public int getTwoDigitsRinexPRN() {
109 return system == SatelliteSystem.SBAS ?
110 prn - SBAS_SHIFT :
111 (system == SatelliteSystem.QZSS ? prn - QZSS_SHIFT : prn);
112 }
113
114 /** {@inheritDoc} */
115 @Override
116 public String toString() {
117 return prn < 0 ?
118 String.format(Locale.US, "%c ", system.getKey()) :
119 String.format(Locale.US, "%c%02d", system.getKey(), getTwoDigitsRinexPRN());
120 }
121
122 @Override
123 public boolean equals(final Object object) {
124 if (object instanceof SatInSystem) {
125 final SatInSystem other = (SatInSystem) object;
126 return getSystem().equals(other.getSystem()) && getPRN() == other.getPRN();
127 }
128 return false;
129 }
130
131 @Override
132 public int hashCode() {
133 return Character.hashCode(getSystem().getKey()) ^ getPRN();
134 }
135
136 }