• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.location;
18 
19 import android.annotation.FlaggedApi;
20 import android.annotation.FloatRange;
21 import android.annotation.IntDef;
22 import android.annotation.IntRange;
23 import android.annotation.NonNull;
24 import android.annotation.SystemApi;
25 import android.location.flags.Flags;
26 import android.os.Parcel;
27 import android.os.Parcelable;
28 
29 import com.android.internal.util.Preconditions;
30 
31 import java.lang.annotation.Retention;
32 import java.lang.annotation.RetentionPolicy;
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.List;
36 
37 /**
38  * Contains ephemeris parameters specific to Galileo satellites.
39  *
40  * @hide
41  */
42 @FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
43 @SystemApi
44 public final class GalileoSatelliteEphemeris implements Parcelable {
45 
46     /** PRN or satellite ID number for the Galileo satellite. */
47     private int mSvid;
48 
49     /** Array of satellite clock model. */
50     @NonNull private final List<GalileoSatelliteClockModel> mSatelliteClockModels;
51 
52     /** Satellite orbit model. */
53     @NonNull private final KeplerianOrbitModel mSatelliteOrbitModel;
54 
55     /** Satellite health. */
56     @NonNull private final GalileoSvHealth mSatelliteHealth;
57 
58     /** Satellite ephemeris time. */
59     @NonNull private final SatelliteEphemerisTime mSatelliteEphemerisTime;
60 
GalileoSatelliteEphemeris(Builder builder)61     private GalileoSatelliteEphemeris(Builder builder) {
62         // Allow svid beyond the range to support potential future extensibility.
63         Preconditions.checkArgument(builder.mSvid >= 1);
64         Preconditions.checkNotNull(
65                 builder.mSatelliteClockModels, "SatelliteClockModels cannot be null");
66         Preconditions.checkNotNull(
67                 builder.mSatelliteOrbitModel, "SatelliteOrbitModel cannot be null");
68         Preconditions.checkNotNull(builder.mSatelliteHealth, "SatelliteHealth cannot be null");
69         Preconditions.checkNotNull(
70                 builder.mSatelliteEphemerisTime, "SatelliteEphemerisTime cannot be null");
71         mSvid = builder.mSvid;
72         final List<GalileoSatelliteClockModel> satelliteClockModels = builder.mSatelliteClockModels;
73         mSatelliteClockModels = Collections.unmodifiableList(new ArrayList<>(satelliteClockModels));
74         mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
75         mSatelliteHealth = builder.mSatelliteHealth;
76         mSatelliteEphemerisTime = builder.mSatelliteEphemerisTime;
77     }
78 
79     /** Returns the PRN or satellite ID number for the Galileo satellite. */
80     @IntRange(from = 1, to = 36)
getSvid()81     public int getSvid() {
82         return mSvid;
83     }
84 
85     /** Returns the list of satellite clock models. */
86     @NonNull
getSatelliteClockModels()87     public List<GalileoSatelliteClockModel> getSatelliteClockModels() {
88         return mSatelliteClockModels;
89     }
90 
91     /** Returns the satellite orbit model. */
92     @NonNull
getSatelliteOrbitModel()93     public KeplerianOrbitModel getSatelliteOrbitModel() {
94         return mSatelliteOrbitModel;
95     }
96 
97     /** Returns the satellite health. */
98     @NonNull
getSatelliteHealth()99     public GalileoSvHealth getSatelliteHealth() {
100         return mSatelliteHealth;
101     }
102 
103     /** Returns the satellite ephemeris time. */
104     @NonNull
getSatelliteEphemerisTime()105     public SatelliteEphemerisTime getSatelliteEphemerisTime() {
106         return mSatelliteEphemerisTime;
107     }
108 
109     public static final @NonNull Creator<GalileoSatelliteEphemeris> CREATOR =
110             new Creator<GalileoSatelliteEphemeris>() {
111                 @Override
112                 @NonNull
113                 public GalileoSatelliteEphemeris createFromParcel(Parcel in) {
114                     final GalileoSatelliteEphemeris.Builder galileoSatelliteEphemeris =
115                             new Builder();
116                     galileoSatelliteEphemeris.setSvid(in.readInt());
117                     List<GalileoSatelliteClockModel> satelliteClockModels = new ArrayList<>();
118                     in.readTypedList(satelliteClockModels, GalileoSatelliteClockModel.CREATOR);
119                     galileoSatelliteEphemeris.setSatelliteClockModels(satelliteClockModels);
120                     galileoSatelliteEphemeris.setSatelliteOrbitModel(
121                             in.readTypedObject(KeplerianOrbitModel.CREATOR));
122                     galileoSatelliteEphemeris.setSatelliteHealth(
123                             in.readTypedObject(GalileoSvHealth.CREATOR));
124                     galileoSatelliteEphemeris.setSatelliteEphemerisTime(
125                             in.readTypedObject(SatelliteEphemerisTime.CREATOR));
126                     return galileoSatelliteEphemeris.build();
127                 }
128 
129                 @Override
130                 public GalileoSatelliteEphemeris[] newArray(int size) {
131                     return new GalileoSatelliteEphemeris[size];
132                 }
133             };
134 
135     @Override
describeContents()136     public int describeContents() {
137         return 0;
138     }
139 
140     @Override
writeToParcel(@onNull Parcel parcel, int flags)141     public void writeToParcel(@NonNull Parcel parcel, int flags) {
142         parcel.writeInt(mSvid);
143         parcel.writeTypedList(mSatelliteClockModels, flags);
144         parcel.writeTypedObject(mSatelliteOrbitModel, flags);
145         parcel.writeTypedObject(mSatelliteHealth, flags);
146         parcel.writeTypedObject(mSatelliteEphemerisTime, flags);
147     }
148 
149     @Override
150     @NonNull
toString()151     public String toString() {
152         StringBuilder builder = new StringBuilder("GalileoSatelliteEphemeris[");
153         builder.append("svid = ").append(mSvid);
154         builder.append(", satelliteClockModels = ").append(mSatelliteClockModels);
155         builder.append(", satelliteOrbitModel = ").append(mSatelliteOrbitModel);
156         builder.append(", satelliteHealth = ").append(mSatelliteHealth);
157         builder.append(", satelliteEphemerisTime = ").append(mSatelliteEphemerisTime);
158         builder.append("]");
159         return builder.toString();
160     }
161 
162     /** Builder for {@link GalileoSatelliteEphemeris}. */
163     public static final class Builder {
164         private int mSvid;
165         private List<GalileoSatelliteClockModel> mSatelliteClockModels;
166         private KeplerianOrbitModel mSatelliteOrbitModel;
167         private GalileoSvHealth mSatelliteHealth;
168         private SatelliteEphemerisTime mSatelliteEphemerisTime;
169 
170         /** Sets the PRN or satellite ID number for the Galileo satellite. */
171         @NonNull
setSvid(@ntRangefrom = 1, to = 36) int svid)172         public Builder setSvid(@IntRange(from = 1, to = 36) int svid) {
173             mSvid = svid;
174             return this;
175         }
176 
177         /** Sets the array of satellite clock model. */
178         @NonNull
setSatelliteClockModels( @onNull List<GalileoSatelliteClockModel> satelliteClockModels)179         public Builder setSatelliteClockModels(
180                 @NonNull List<GalileoSatelliteClockModel> satelliteClockModels) {
181             mSatelliteClockModels = satelliteClockModels;
182             return this;
183         }
184 
185         /** Sets the satellite orbit model. */
186         @NonNull
setSatelliteOrbitModel(@onNull KeplerianOrbitModel satelliteOrbitModel)187         public Builder setSatelliteOrbitModel(@NonNull KeplerianOrbitModel satelliteOrbitModel) {
188             mSatelliteOrbitModel = satelliteOrbitModel;
189             return this;
190         }
191 
192         /** Sets the satellite health. */
193         @NonNull
setSatelliteHealth(@onNull GalileoSvHealth satelliteHealth)194         public Builder setSatelliteHealth(@NonNull GalileoSvHealth satelliteHealth) {
195             mSatelliteHealth = satelliteHealth;
196             return this;
197         }
198 
199         /** Sets the satellite ephemeris time. */
200         @NonNull
setSatelliteEphemerisTime( @onNull SatelliteEphemerisTime satelliteEphemerisTime)201         public Builder setSatelliteEphemerisTime(
202                 @NonNull SatelliteEphemerisTime satelliteEphemerisTime) {
203             mSatelliteEphemerisTime = satelliteEphemerisTime;
204             return this;
205         }
206 
207         /** Builds a {@link GalileoSatelliteEphemeris} instance as specified by this builder. */
208         @NonNull
build()209         public GalileoSatelliteEphemeris build() {
210             return new GalileoSatelliteEphemeris(this);
211         }
212     }
213 
214     /**
215      * A class contains the set of parameters needed for Galileo satellite health.
216      *
217      * <p>This is defined in Galileo-OS-SIS-ICD 5.1.9.3.
218      */
219     public static final class GalileoSvHealth implements Parcelable {
220 
221         /**
222          * Galileo data validity status.
223          *
224          * @hide
225          */
226         @Retention(RetentionPolicy.SOURCE)
227         @IntDef({DATA_STATUS_DATA_VALID, DATA_STATUS_WORKING_WITHOUT_GUARANTEE})
228         public @interface GalileoDataValidityStatus {}
229 
230         /**
231          * The following enumerations must be in sync with the values declared in
232          * GalileoHealthDataVaidityType in GalileoSatelliteEphemeris.aidl.
233          */
234 
235         /** Data validity status is data valid. */
236         public static final int DATA_STATUS_DATA_VALID = 0;
237 
238         /** Data validity status is working without guarantee. */
239         public static final int DATA_STATUS_WORKING_WITHOUT_GUARANTEE = 1;
240 
241         /**
242          * Galileo signal health status.
243          *
244          * @hide
245          */
246         @Retention(RetentionPolicy.SOURCE)
247         @IntDef({
248             HEALTH_STATUS_OK,
249             HEALTH_STATUS_OUT_OF_SERVICE,
250             HEALTH_STATUS_EXTENDED_OPERATION_MODE,
251             HEALTH_STATUS_IN_TEST
252         })
253         public @interface GalileoHealthStatus {}
254 
255         /**
256          * The following enumerations must be in sync with the values declared in
257          * GalileoHealthStatusType in GalileoSatelliteEphemeris.aidl.
258          */
259 
260         /** Health status is ok. */
261         public static final int HEALTH_STATUS_OK = 0;
262 
263         /** Health status is out of service. */
264         public static final int HEALTH_STATUS_OUT_OF_SERVICE = 1;
265 
266         /** Health status is in extended operation mode. */
267         public static final int HEALTH_STATUS_EXTENDED_OPERATION_MODE = 2;
268 
269         /** Health status is in test mode. */
270         public static final int HEALTH_STATUS_IN_TEST = 3;
271 
272         /** E1-B data validity status. */
273         private @GalileoDataValidityStatus int mDataValidityStatusE1b;
274 
275         /** E1-B/C signal health status. */
276         private @GalileoHealthStatus int mSignalHealthStatusE1b;
277 
278         /** E5a data validity status. */
279         private @GalileoDataValidityStatus int mDataValidityStatusE5a;
280 
281         /** E5a signal health status. */
282         private @GalileoHealthStatus int mSignalHealthStatusE5a;
283 
284         /** E5b data validity status. */
285         private @GalileoDataValidityStatus int mDataValidityStatusE5b;
286 
287         /** E5b signal health status. */
288         private @GalileoHealthStatus int mSignalHealthStatusE5b;
289 
GalileoSvHealth(Builder builder)290         private GalileoSvHealth(Builder builder) {
291             Preconditions.checkArgumentInRange(
292                     builder.mDataValidityStatusE1b,
293                     DATA_STATUS_DATA_VALID,
294                     DATA_STATUS_WORKING_WITHOUT_GUARANTEE,
295                     "DataValidityStatusE1b");
296             Preconditions.checkArgumentInRange(
297                     builder.mSignalHealthStatusE1b,
298                     HEALTH_STATUS_OK,
299                     HEALTH_STATUS_IN_TEST,
300                     "SignalHealthStatusE1b");
301             Preconditions.checkArgumentInRange(
302                     builder.mDataValidityStatusE5a,
303                     DATA_STATUS_DATA_VALID,
304                     DATA_STATUS_WORKING_WITHOUT_GUARANTEE,
305                     "DataValidityStatusE5a");
306             Preconditions.checkArgumentInRange(
307                     builder.mSignalHealthStatusE5a,
308                     HEALTH_STATUS_OK,
309                     HEALTH_STATUS_IN_TEST,
310                     "SignalHealthStatusE5a");
311             Preconditions.checkArgumentInRange(
312                     builder.mDataValidityStatusE5b,
313                     DATA_STATUS_DATA_VALID,
314                     DATA_STATUS_WORKING_WITHOUT_GUARANTEE,
315                     "DataValidityStatusE5b");
316             Preconditions.checkArgumentInRange(
317                     builder.mSignalHealthStatusE5b,
318                     HEALTH_STATUS_OK,
319                     HEALTH_STATUS_IN_TEST,
320                     "SignalHealthStatusE5b");
321             mDataValidityStatusE1b = builder.mDataValidityStatusE1b;
322             mSignalHealthStatusE1b = builder.mSignalHealthStatusE1b;
323             mDataValidityStatusE5a = builder.mDataValidityStatusE5a;
324             mSignalHealthStatusE5a = builder.mSignalHealthStatusE5a;
325             mDataValidityStatusE5b = builder.mDataValidityStatusE5b;
326             mSignalHealthStatusE5b = builder.mSignalHealthStatusE5b;
327         }
328 
329         /** Returns the E1-B data validity status. */
330         @GalileoDataValidityStatus
getDataValidityStatusE1b()331         public int getDataValidityStatusE1b() {
332             return mDataValidityStatusE1b;
333         }
334 
335         /** Returns the E1-B/C signal health status. */
336         @GalileoHealthStatus
getSignalHealthStatusE1b()337         public int getSignalHealthStatusE1b() {
338             return mSignalHealthStatusE1b;
339         }
340 
341         /** Returns the E5a data validity status. */
342         @GalileoDataValidityStatus
getDataValidityStatusE5a()343         public int getDataValidityStatusE5a() {
344             return mDataValidityStatusE5a;
345         }
346 
347         /** Returns the E5a signal health status. */
348         @GalileoHealthStatus
getSignalHealthStatusE5a()349         public int getSignalHealthStatusE5a() {
350             return mSignalHealthStatusE5a;
351         }
352 
353         /** Returns the E5b data validity status. */
354         @GalileoDataValidityStatus
getDataValidityStatusE5b()355         public int getDataValidityStatusE5b() {
356             return mDataValidityStatusE5b;
357         }
358 
359         /** Returns the E5b signal health status. */
360         @GalileoHealthStatus
getSignalHealthStatusE5b()361         public int getSignalHealthStatusE5b() {
362             return mSignalHealthStatusE5b;
363         }
364 
365         public static final @NonNull Creator<GalileoSvHealth> CREATOR =
366                 new Creator<GalileoSvHealth>() {
367                     @Override
368                     @NonNull
369                     public GalileoSvHealth createFromParcel(Parcel in) {
370                         final GalileoSvHealth.Builder galileoSvHealth = new Builder();
371                         galileoSvHealth.setDataValidityStatusE1b(in.readInt());
372                         galileoSvHealth.setSignalHealthStatusE1b(in.readInt());
373                         galileoSvHealth.setDataValidityStatusE5a(in.readInt());
374                         galileoSvHealth.setSignalHealthStatusE5a(in.readInt());
375                         galileoSvHealth.setDataValidityStatusE5b(in.readInt());
376                         galileoSvHealth.setSignalHealthStatusE5b(in.readInt());
377                         return galileoSvHealth.build();
378                     }
379 
380                     @Override
381                     public GalileoSvHealth[] newArray(int size) {
382                         return new GalileoSvHealth[size];
383                     }
384                 };
385 
386         @Override
describeContents()387         public int describeContents() {
388             return 0;
389         }
390 
391         @Override
writeToParcel(@onNull Parcel parcel, int flags)392         public void writeToParcel(@NonNull Parcel parcel, int flags) {
393             parcel.writeInt(mDataValidityStatusE1b);
394             parcel.writeInt(mSignalHealthStatusE1b);
395             parcel.writeInt(mDataValidityStatusE5a);
396             parcel.writeInt(mSignalHealthStatusE5a);
397             parcel.writeInt(mDataValidityStatusE5b);
398             parcel.writeInt(mSignalHealthStatusE5b);
399         }
400 
401         @Override
402         @NonNull
toString()403         public String toString() {
404             StringBuilder builder = new StringBuilder("GalileoSvHealth[");
405             builder.append("dataValidityStatusE1b = ").append(mDataValidityStatusE1b);
406             builder.append(", signalHealthStatusE1b = ").append(mSignalHealthStatusE1b);
407             builder.append(", dataValidityStatusE5a = ").append(mDataValidityStatusE5a);
408             builder.append(", signalHealthStatusE5a = ").append(mSignalHealthStatusE5a);
409             builder.append(", dataValidityStatusE5b = ").append(mDataValidityStatusE5b);
410             builder.append(", signalHealthStatusE5b = ").append(mSignalHealthStatusE5b);
411             builder.append("]");
412             return builder.toString();
413         }
414 
415         /** Builder for {@link GalileoSvHealth}. */
416         public static final class Builder {
417             private int mDataValidityStatusE1b;
418             private int mSignalHealthStatusE1b;
419             private int mDataValidityStatusE5a;
420             private int mSignalHealthStatusE5a;
421             private int mDataValidityStatusE5b;
422             private int mSignalHealthStatusE5b;
423 
424             /** Sets the E1-B data validity status. */
425             @NonNull
setDataValidityStatusE1b( @alileoDataValidityStatus int dataValidityStatusE1b)426             public Builder setDataValidityStatusE1b(
427                     @GalileoDataValidityStatus int dataValidityStatusE1b) {
428                 mDataValidityStatusE1b = dataValidityStatusE1b;
429                 return this;
430             }
431 
432             /** Sets the E1-B/C signal health status. */
433             @NonNull
setSignalHealthStatusE1b( @alileoHealthStatus int signalHealthStatusE1b)434             public Builder setSignalHealthStatusE1b(
435                     @GalileoHealthStatus int signalHealthStatusE1b) {
436                 mSignalHealthStatusE1b = signalHealthStatusE1b;
437                 return this;
438             }
439 
440             /** Sets the E5a data validity status. */
441             @NonNull
setDataValidityStatusE5a( @alileoDataValidityStatus int dataValidityStatusE5a)442             public Builder setDataValidityStatusE5a(
443                     @GalileoDataValidityStatus int dataValidityStatusE5a) {
444                 mDataValidityStatusE5a = dataValidityStatusE5a;
445                 return this;
446             }
447 
448             /** Sets the E5a signal health status. */
449             @NonNull
setSignalHealthStatusE5a( @alileoHealthStatus int signalHealthStatusE5a)450             public Builder setSignalHealthStatusE5a(
451                     @GalileoHealthStatus int signalHealthStatusE5a) {
452                 mSignalHealthStatusE5a = signalHealthStatusE5a;
453                 return this;
454             }
455 
456             /** Sets the E5b data validity status. */
457             @NonNull
setDataValidityStatusE5b( @alileoDataValidityStatus int dataValidityStatusE5b)458             public Builder setDataValidityStatusE5b(
459                     @GalileoDataValidityStatus int dataValidityStatusE5b) {
460                 mDataValidityStatusE5b = dataValidityStatusE5b;
461                 return this;
462             }
463 
464             /** Sets the E5b signal health status. */
465             @NonNull
setSignalHealthStatusE5b( @alileoHealthStatus int signalHealthStatusE5b)466             public Builder setSignalHealthStatusE5b(
467                     @GalileoHealthStatus int signalHealthStatusE5b) {
468                 mSignalHealthStatusE5b = signalHealthStatusE5b;
469                 return this;
470             }
471 
472             /** Builds a {@link GalileoSvHealth}. */
473             @NonNull
build()474             public GalileoSvHealth build() {
475                 return new GalileoSvHealth(this);
476             }
477         }
478     }
479 
480     /**
481      * A class contains the set of parameters needed for Galileo satellite clock correction.
482      *
483      * <p>This is defined in Galileo-OS-SIS-ICD 5.1.3.
484      */
485     public static final class GalileoSatelliteClockModel implements Parcelable {
486 
487         /**
488          * The type of the satellite clock.
489          *
490          * @hide
491          */
492         @Retention(RetentionPolicy.SOURCE)
493         @IntDef({TYPE_UNDEFINED, TYPE_FNAV, TYPE_INAV})
494         public @interface SatelliteClockType {}
495 
496         /**
497          * The following enumerations must be in sync with the values declared in
498          * GalileoSatelliteEphemeris.aidl.
499          */
500 
501         /** The type of the satellite clock is unknown. */
502         public static final int TYPE_UNDEFINED = 0;
503 
504         /** The type of the satellite clock is FNAV. */
505         public static final int TYPE_FNAV = 1;
506 
507         /** The type of the satellite clock is INAV. */
508         public static final int TYPE_INAV = 2;
509 
510         /**
511          * Time of the clock in seconds since Galileo epoch.
512          *
513          * <p>Corresponds to the 'Epoch' field within the 'SV/EPOCH/SV CLK' record of Galileo
514          * navigation message in RINEX 3.05 Table A8.
515          */
516         private final long mTimeOfClockSeconds;
517 
518         /** SV clock bias correction coefficient in seconds. */
519         private double mAf0;
520 
521         /** SV clock drift correction coefficient in seconds per second. */
522         private double mAf1;
523 
524         /** SV clock drift rate correction coefficient in seconds per second squared. */
525         private double mAf2;
526 
527         /**
528          * Broadcast group delay in seconds.
529          *
530          * <p>This is defined in Galileo-OS-SIS-ICD 5.1.5.
531          */
532         private double mBgdSeconds;
533 
534         /**
535          * Signal in space accuracy in meters.
536          *
537          * <p>This is defined in Galileo-OS-SIS-ICD 5.1.12.
538          */
539         private double mSisaMeters;
540 
541         /** Type of satellite clock . */
542         private final @SatelliteClockType int mSatelliteClockType;
543 
GalileoSatelliteClockModel(Builder builder)544         private GalileoSatelliteClockModel(Builder builder) {
545             Preconditions.checkArgument(builder.mTimeOfClockSeconds >= 0);
546             Preconditions.checkArgumentInRange(builder.mAf0, -0.0625f, 0.0625f, "AF0");
547             Preconditions.checkArgumentInRange(builder.mAf1, -1.5e-8f, 1.5e-8f, "AF1");
548             Preconditions.checkArgumentInRange(builder.mAf2, -5.56e-17f, 5.56e-17f, "AF2");
549             Preconditions.checkArgumentInRange(
550                     builder.mBgdSeconds, -1.2e-7f, 1.2e-7f, "BgdSeconds");
551             Preconditions.checkArgument(builder.mSisaMeters >= 0.0f);
552             Preconditions.checkArgumentInRange(
553                     builder.mSatelliteClockType, TYPE_UNDEFINED, TYPE_INAV, "SatelliteClockType");
554             mTimeOfClockSeconds = builder.mTimeOfClockSeconds;
555             mAf0 = builder.mAf0;
556             mAf1 = builder.mAf1;
557             mAf2 = builder.mAf2;
558             mBgdSeconds = builder.mBgdSeconds;
559             mSisaMeters = builder.mSisaMeters;
560             mSatelliteClockType = builder.mSatelliteClockType;
561         }
562 
563         /** Returns the time of the clock in seconds since Galileo epoch. */
564         @IntRange(from = 0)
getTimeOfClockSeconds()565         public long getTimeOfClockSeconds() {
566             return mTimeOfClockSeconds;
567         }
568 
569         /** Returns the SV clock bias correction coefficient in seconds. */
570         @FloatRange(from = -0.0625f, to = 0.0625f)
getAf0()571         public double getAf0() {
572             return mAf0;
573         }
574 
575         /** Returns the SV clock drift correction coefficient in seconds per second. */
576         @FloatRange(from = -1.5e-8f, to = 1.5e-8f)
getAf1()577         public double getAf1() {
578             return mAf1;
579         }
580 
581         /** Returns the SV clock drift rate correction coefficient in seconds per second squared. */
582         @FloatRange(from = -5.56e-17f, to = 5.56e-17f)
getAf2()583         public double getAf2() {
584             return mAf2;
585         }
586 
587         /** Returns the broadcast group delay in seconds. */
588         @FloatRange(from = -1.2e-7f, to = 1.2e-7f)
getBgdSeconds()589         public double getBgdSeconds() {
590             return mBgdSeconds;
591         }
592 
593         /** Returns the signal in space accuracy in meters. */
594         @FloatRange(from = 0.0f)
getSisaMeters()595         public double getSisaMeters() {
596             return mSisaMeters;
597         }
598 
599         /** Returns the type of satellite clock. */
getSatelliteClockType()600         public @SatelliteClockType int getSatelliteClockType() {
601             return mSatelliteClockType;
602         }
603 
604         public static final @NonNull Creator<GalileoSatelliteClockModel> CREATOR =
605                 new Creator<GalileoSatelliteClockModel>() {
606                     @Override
607                     @NonNull
608                     public GalileoSatelliteClockModel createFromParcel(Parcel in) {
609                         final GalileoSatelliteClockModel.Builder galileoSatelliteClockModel =
610                                 new Builder();
611                         galileoSatelliteClockModel.setTimeOfClockSeconds(in.readLong());
612                         galileoSatelliteClockModel.setAf0(in.readDouble());
613                         galileoSatelliteClockModel.setAf1(in.readDouble());
614                         galileoSatelliteClockModel.setAf2(in.readDouble());
615                         galileoSatelliteClockModel.setBgdSeconds(in.readDouble());
616                         galileoSatelliteClockModel.setSisaMeters(in.readDouble());
617                         galileoSatelliteClockModel.setSatelliteClockType(in.readInt());
618                         return galileoSatelliteClockModel.build();
619                     }
620 
621                     @Override
622                     public GalileoSatelliteClockModel[] newArray(int size) {
623                         return new GalileoSatelliteClockModel[size];
624                     }
625                 };
626 
627         @Override
describeContents()628         public int describeContents() {
629             return 0;
630         }
631 
632         @Override
writeToParcel(@onNull Parcel parcel, int flags)633         public void writeToParcel(@NonNull Parcel parcel, int flags) {
634             parcel.writeLong(mTimeOfClockSeconds);
635             parcel.writeDouble(mAf0);
636             parcel.writeDouble(mAf1);
637             parcel.writeDouble(mAf2);
638             parcel.writeDouble(mBgdSeconds);
639             parcel.writeDouble(mSisaMeters);
640             parcel.writeInt(mSatelliteClockType);
641         }
642 
643         @Override
644         @NonNull
toString()645         public String toString() {
646             StringBuilder builder = new StringBuilder("GalileoSatelliteClockModel[");
647             builder.append("timeOfClockSeconds = ").append(mTimeOfClockSeconds);
648             builder.append(", af0 = ").append(mAf0);
649             builder.append(", af1 = ").append(mAf1);
650             builder.append(", af2 = ").append(mAf2);
651             builder.append(", bgdSeconds = ").append(mBgdSeconds);
652             builder.append(", sisaMeters = ").append(mSisaMeters);
653             builder.append(", satelliteClockType = ").append(mSatelliteClockType);
654             builder.append("]");
655             return builder.toString();
656         }
657 
658         /** Builder for {@link GalileoSatelliteClockModel}. */
659         public static final class Builder {
660             private long mTimeOfClockSeconds;
661             private double mAf0;
662             private double mAf1;
663             private double mAf2;
664             private double mBgdSeconds;
665             private double mSisaMeters;
666             private @SatelliteClockType int mSatelliteClockType;
667 
668             /** Sets the time of the clock in seconds since Galileo epoch. */
669             @NonNull
setTimeOfClockSeconds(@ntRangefrom = 0) long timeOfClockSeconds)670             public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
671                 mTimeOfClockSeconds = timeOfClockSeconds;
672                 return this;
673             }
674 
675             /** Sets the SV clock bias correction coefficient in seconds. */
676             @NonNull
setAf0(@loatRangefrom = -0.0625f, to = 0.0625f) double af0)677             public Builder setAf0(@FloatRange(from = -0.0625f, to = 0.0625f) double af0) {
678                 mAf0 = af0;
679                 return this;
680             }
681 
682             /** Sets the SV clock drift correction coefficient in seconds per second. */
683             @NonNull
setAf1(@loatRangefrom = -1.5e-8f, to = 1.5e-8f) double af1)684             public Builder setAf1(@FloatRange(from = -1.5e-8f, to = 1.5e-8f) double af1) {
685                 mAf1 = af1;
686                 return this;
687             }
688 
689             /**
690              * Sets the SV clock drift rate correction coefficient in seconds per second squared.
691              */
692             @NonNull
setAf2(@loatRangefrom = -5.56e-17f, to = 5.56e-17f) double af2)693             public Builder setAf2(@FloatRange(from = -5.56e-17f, to = 5.56e-17f) double af2) {
694                 mAf2 = af2;
695                 return this;
696             }
697 
698             /** Sets the broadcast group delay in seconds. */
699             @NonNull
setBgdSeconds( @loatRangefrom = -1.2e-7f, to = 1.2e-7f) double bgdSeconds)700             public Builder setBgdSeconds(
701                     @FloatRange(from = -1.2e-7f, to = 1.2e-7f) double bgdSeconds) {
702                 mBgdSeconds = bgdSeconds;
703                 return this;
704             }
705 
706             /** Sets the signal in space accuracy in meters. */
707             @NonNull
setSisaMeters(@loatRangefrom = 0.0f) double sisaMeters)708             public Builder setSisaMeters(@FloatRange(from = 0.0f) double sisaMeters) {
709                 mSisaMeters = sisaMeters;
710                 return this;
711             }
712 
713             /** Sets the type of satellite clock. */
714             @NonNull
setSatelliteClockType(@atelliteClockType int satelliteClockType)715             public Builder setSatelliteClockType(@SatelliteClockType int satelliteClockType) {
716                 mSatelliteClockType = satelliteClockType;
717                 return this;
718             }
719 
720             /**
721              * Builds a {@link GalileoSatelliteClockModel} instance as specified by this builder.
722              */
723             @NonNull
build()724             public GalileoSatelliteClockModel build() {
725                 return new GalileoSatelliteClockModel(this);
726             }
727         }
728     }
729 }
730