@@ -118,12 +118,145 @@ impl Observable {
118
118
}
119
119
}
120
120
121
- /// Tries to reconstruct a [Carrier] signal from this [Observable].
122
- /// This will work if our database knows this [Self::code].
123
- pub fn carrier ( & self , c : Constellation ) -> Result < Carrier , Error > {
121
+ /// Tries to convert into [Carrier] frequency.
122
+ pub fn to_carrier ( & self , c : Constellation ) -> Result < Carrier , Error > {
124
123
Carrier :: from_observable ( c, self )
125
124
}
126
125
126
+ /// Tries to create a Pseudo Range [Observable] from
127
+ /// provided signal frequency in MHz and provided [Constellation].
128
+ /// This requires a 1kHz accuracy on given frequency.
129
+ pub fn from_pseudo_range_frequency_mega_hz (
130
+ constellation : Constellation ,
131
+ freq_mhz : f64 ,
132
+ ) -> Result < Self , Error > {
133
+ let carrier = Carrier :: from_frequency_mega_hz ( freq_mhz) ?;
134
+
135
+ match constellation {
136
+ Constellation :: GPS => match carrier {
137
+ Carrier :: L1 => return Ok ( Self :: PseudoRange ( "C1C" . to_string ( ) ) ) ,
138
+ Carrier :: L2 => return Ok ( Self :: PseudoRange ( "C2C" . to_string ( ) ) ) ,
139
+ Carrier :: L5 => return Ok ( Self :: PseudoRange ( "C5X" . to_string ( ) ) ) ,
140
+ _ => return Err ( Error :: UnknownGPSFrequency ) ,
141
+ } ,
142
+ Constellation :: Galileo => match carrier {
143
+ Carrier :: L1 => return Ok ( Self :: PseudoRange ( "C1C" . to_string ( ) ) ) ,
144
+ Carrier :: L5 => return Ok ( Self :: PseudoRange ( "C5X" . to_string ( ) ) ) ,
145
+ Carrier :: E6 => return Ok ( Self :: PseudoRange ( "C6X" . to_string ( ) ) ) ,
146
+ Carrier :: E5b => return Ok ( Self :: PseudoRange ( "C7X" . to_string ( ) ) ) ,
147
+ Carrier :: E5a5b => return Ok ( Self :: PseudoRange ( "C8X" . to_string ( ) ) ) ,
148
+ _ => return Err ( Error :: UnknownGalileoFrequency ) ,
149
+ } ,
150
+ Constellation :: QZSS => match carrier {
151
+ Carrier :: L1 => return Ok ( Self :: PseudoRange ( "C1C" . to_string ( ) ) ) ,
152
+ Carrier :: L2 => return Ok ( Self :: PseudoRange ( "C2X" . to_string ( ) ) ) ,
153
+ Carrier :: L5 => return Ok ( Self :: PseudoRange ( "C5X" . to_string ( ) ) ) ,
154
+ Carrier :: E6 => return Ok ( Self :: PseudoRange ( "C6X" . to_string ( ) ) ) ,
155
+ _ => return Err ( Error :: UnknownQzssFrequency ) ,
156
+ } ,
157
+ Constellation :: BeiDou => match carrier {
158
+ Carrier :: B1 => return Ok ( Self :: PseudoRange ( "C2X" . to_string ( ) ) ) ,
159
+ Carrier :: L1 => return Ok ( Self :: PseudoRange ( "C1X" . to_string ( ) ) ) ,
160
+ Carrier :: L5 => return Ok ( Self :: PseudoRange ( "C5X" . to_string ( ) ) ) ,
161
+ Carrier :: E5b => return Ok ( Self :: PseudoRange ( "C7X" . to_string ( ) ) ) ,
162
+ Carrier :: E5a5b => return Ok ( Self :: PseudoRange ( "C8X" . to_string ( ) ) ) ,
163
+ Carrier :: B3 => return Ok ( Self :: PseudoRange ( "C6X" . to_string ( ) ) ) ,
164
+ _ => return Err ( Error :: UnknownBDSFrequency ) ,
165
+ } ,
166
+ Constellation :: Glonass => match carrier {
167
+ Carrier :: G1 ( _) => return Ok ( Self :: PseudoRange ( "C1C" . to_string ( ) ) ) ,
168
+ Carrier :: G2 ( _) => return Ok ( Self :: PseudoRange ( "C2X" . to_string ( ) ) ) ,
169
+ Carrier :: G3 => return Ok ( Self :: PseudoRange ( "C3X" . to_string ( ) ) ) ,
170
+ Carrier :: G1a => return Ok ( Self :: PseudoRange ( "C4X" . to_string ( ) ) ) ,
171
+ Carrier :: G2a => return Ok ( Self :: PseudoRange ( "C6X" . to_string ( ) ) ) ,
172
+ _ => return Err ( Error :: UnknownGlonassFrequency ) ,
173
+ } ,
174
+ Constellation :: IRNSS => match carrier {
175
+ Carrier :: L5 => return Ok ( Self :: PseudoRange ( "C5X" . to_string ( ) ) ) ,
176
+ Carrier :: S => return Ok ( Self :: PseudoRange ( "C9X" . to_string ( ) ) ) ,
177
+ _ => return Err ( Error :: UnknownIRNSSFrequency ) ,
178
+ } ,
179
+ _ => { } ,
180
+ }
181
+
182
+ if constellation. is_sbas ( ) {
183
+ match carrier {
184
+ Carrier :: L1 => Ok ( Self :: PseudoRange ( "C1C" . to_string ( ) ) ) ,
185
+ Carrier :: L5 => Ok ( Self :: PseudoRange ( "C5X" . to_string ( ) ) ) ,
186
+ _ => Err ( Error :: UnknownSBASFrequency ) ,
187
+ }
188
+ } else {
189
+ Err ( Error :: UnknownFrequency )
190
+ }
191
+ }
192
+
193
+ /// Tries to create a Phase Range [Observable] from
194
+ /// provided signal frequency in MHz and provided [Constellation].
195
+ /// This requires a 1kHz accuracy on given frequency.
196
+ pub fn from_phase_range_frequency_mega_hz (
197
+ constellation : Constellation ,
198
+ freq_mhz : f64 ,
199
+ ) -> Result < Self , Error > {
200
+ let carrier = Carrier :: from_frequency_mega_hz ( freq_mhz) ?;
201
+
202
+ match constellation {
203
+ Constellation :: GPS => match carrier {
204
+ Carrier :: L1 => return Ok ( Self :: PhaseRange ( "L1C" . to_string ( ) ) ) ,
205
+ Carrier :: L2 => return Ok ( Self :: PhaseRange ( "L2C" . to_string ( ) ) ) ,
206
+ Carrier :: L5 => return Ok ( Self :: PhaseRange ( "L5X" . to_string ( ) ) ) ,
207
+ _ => return Err ( Error :: UnknownGPSFrequency ) ,
208
+ } ,
209
+ Constellation :: Galileo => match carrier {
210
+ Carrier :: L1 => return Ok ( Self :: PhaseRange ( "L1C" . to_string ( ) ) ) ,
211
+ Carrier :: L5 => return Ok ( Self :: PhaseRange ( "L5X" . to_string ( ) ) ) ,
212
+ Carrier :: E6 => return Ok ( Self :: PhaseRange ( "L6X" . to_string ( ) ) ) ,
213
+ Carrier :: E5b => return Ok ( Self :: PhaseRange ( "L7X" . to_string ( ) ) ) ,
214
+ Carrier :: E5a5b => return Ok ( Self :: PhaseRange ( "L8X" . to_string ( ) ) ) ,
215
+ _ => return Err ( Error :: UnknownGalileoFrequency ) ,
216
+ } ,
217
+ Constellation :: QZSS => match carrier {
218
+ Carrier :: L1 => return Ok ( Self :: PhaseRange ( "L1C" . to_string ( ) ) ) ,
219
+ Carrier :: L2 => return Ok ( Self :: PhaseRange ( "L2X" . to_string ( ) ) ) ,
220
+ Carrier :: L5 => return Ok ( Self :: PhaseRange ( "L5X" . to_string ( ) ) ) ,
221
+ Carrier :: E6 => return Ok ( Self :: PhaseRange ( "L6X" . to_string ( ) ) ) ,
222
+ _ => return Err ( Error :: UnknownQzssFrequency ) ,
223
+ } ,
224
+ Constellation :: BeiDou => match carrier {
225
+ Carrier :: B1 => return Ok ( Self :: PhaseRange ( "L2X" . to_string ( ) ) ) ,
226
+ Carrier :: L1 => return Ok ( Self :: PhaseRange ( "L1X" . to_string ( ) ) ) ,
227
+ Carrier :: L5 => return Ok ( Self :: PhaseRange ( "L5X" . to_string ( ) ) ) ,
228
+ Carrier :: E5b => return Ok ( Self :: PhaseRange ( "L7X" . to_string ( ) ) ) ,
229
+ Carrier :: E5a5b => return Ok ( Self :: PhaseRange ( "L8X" . to_string ( ) ) ) ,
230
+ Carrier :: B3 => return Ok ( Self :: PhaseRange ( "L6X" . to_string ( ) ) ) ,
231
+ _ => return Err ( Error :: UnknownBDSFrequency ) ,
232
+ } ,
233
+ Constellation :: Glonass => match carrier {
234
+ Carrier :: G1 ( _) => return Ok ( Self :: PhaseRange ( "L1C" . to_string ( ) ) ) ,
235
+ Carrier :: G2 ( _) => return Ok ( Self :: PhaseRange ( "L2X" . to_string ( ) ) ) ,
236
+ Carrier :: G3 => return Ok ( Self :: PhaseRange ( "L3X" . to_string ( ) ) ) ,
237
+ Carrier :: G1a => return Ok ( Self :: PhaseRange ( "L4X" . to_string ( ) ) ) ,
238
+ Carrier :: G2a => return Ok ( Self :: PhaseRange ( "L6X" . to_string ( ) ) ) ,
239
+ _ => return Err ( Error :: UnknownGlonassFrequency ) ,
240
+ } ,
241
+ Constellation :: IRNSS => match carrier {
242
+ Carrier :: L5 => return Ok ( Self :: PhaseRange ( "L5X" . to_string ( ) ) ) ,
243
+ Carrier :: S => return Ok ( Self :: PhaseRange ( "L9X" . to_string ( ) ) ) ,
244
+ _ => return Err ( Error :: UnknownIRNSSFrequency ) ,
245
+ } ,
246
+ _ => { } ,
247
+ }
248
+
249
+ if constellation. is_sbas ( ) {
250
+ match carrier {
251
+ Carrier :: L1 => Ok ( Self :: PhaseRange ( "L1C" . to_string ( ) ) ) ,
252
+ Carrier :: L5 => Ok ( Self :: PhaseRange ( "L5X" . to_string ( ) ) ) ,
253
+ _ => Err ( Error :: UnknownSBASFrequency ) ,
254
+ }
255
+ } else {
256
+ Err ( Error :: UnknownFrequency )
257
+ }
258
+ }
259
+
127
260
/// Returns the code length (repetition period), expressed in seconds,
128
261
/// of self: a valid Pseudo Range observable. This is not intended to be used
129
262
/// on phase observables, although they are also determined from PRN codes.
@@ -313,7 +446,7 @@ impl Observable {
313
446
/// used in signal combinations
314
447
pub ( crate ) fn is_l1_pivot ( & self , constellation : Constellation ) -> bool {
315
448
if self . is_phase_range_observable ( ) || self . is_pseudo_range_observable ( ) {
316
- if let Ok ( carrier) = self . carrier ( constellation) {
449
+ if let Ok ( carrier) = self . to_carrier ( constellation) {
317
450
matches ! (
318
451
carrier,
319
452
Carrier :: L1
0 commit comments