• 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.IntRange;
22 import android.annotation.NonNull;
23 import android.annotation.SystemApi;
24 import android.location.flags.Flags;
25 import android.os.Parcel;
26 import android.os.Parcelable;
27 
28 import com.android.internal.util.Preconditions;
29 
30 /**
31  * A class contains ephemeris parameters specific to Beidou satellites.
32  *
33  * @hide
34  */
35 @FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
36 @SystemApi
37 public final class BeidouSatelliteEphemeris implements Parcelable {
38     /** The PRN or satellite ID number for the Beidou satellite. */
39     private final int mSvid;
40 
41     /** Satellite clock model. */
42     private final BeidouSatelliteClockModel mSatelliteClockModel;
43 
44     /** Satellite orbit model. */
45     private final KeplerianOrbitModel mSatelliteOrbitModel;
46 
47     /** Satellite health. */
48     private final BeidouSatelliteHealth mSatelliteHealth;
49 
50     /** Satellite ephemeris time. */
51     private final BeidouSatelliteEphemerisTime mSatelliteEphemerisTime;
52 
BeidouSatelliteEphemeris(Builder builder)53     private BeidouSatelliteEphemeris(Builder builder) {
54         // Allow Svid beyond the range to support potential future extensibility.
55         Preconditions.checkArgument(builder.mSvid >= 1);
56         Preconditions.checkNotNull(builder.mSatelliteClockModel,
57                 "SatelliteClockModel cannot be null");
58         Preconditions.checkNotNull(builder.mSatelliteOrbitModel,
59                 "SatelliteOrbitModel cannot be null");
60         Preconditions.checkNotNull(builder.mSatelliteHealth,
61                 "SatelliteHealth cannot be null");
62         Preconditions.checkNotNull(builder.mSatelliteEphemerisTime,
63                 "SatelliteEphemerisTime cannot be null");
64         mSvid = builder.mSvid;
65         mSatelliteClockModel = builder.mSatelliteClockModel;
66         mSatelliteOrbitModel = builder.mSatelliteOrbitModel;
67         mSatelliteHealth = builder.mSatelliteHealth;
68         mSatelliteEphemerisTime = builder.mSatelliteEphemerisTime;
69     }
70 
71     /** Returns the PRN or satellite ID number for the Beidou satellite. */
72     @IntRange(from = 1, to = 63)
getSvid()73     public int getSvid() {
74         return mSvid;
75     }
76 
77     /** Returns the satellite clock model. */
78     @NonNull
getSatelliteClockModel()79     public BeidouSatelliteClockModel getSatelliteClockModel() {
80         return mSatelliteClockModel;
81     }
82 
83     /** Returns the satellite orbit model. */
84     @NonNull
getSatelliteOrbitModel()85     public KeplerianOrbitModel getSatelliteOrbitModel() {
86         return mSatelliteOrbitModel;
87     }
88 
89     /** Returns the satellite health. */
90     @NonNull
getSatelliteHealth()91     public BeidouSatelliteHealth getSatelliteHealth() {
92         return mSatelliteHealth;
93     }
94 
95     /** Returns the satellite ephemeris time. */
96     @NonNull
getSatelliteEphemerisTime()97     public BeidouSatelliteEphemerisTime getSatelliteEphemerisTime() {
98         return mSatelliteEphemerisTime;
99     }
100 
101     public static final @NonNull Creator<BeidouSatelliteEphemeris> CREATOR =
102             new Creator<BeidouSatelliteEphemeris>() {
103                 @Override
104                 @NonNull
105                 public BeidouSatelliteEphemeris createFromParcel(Parcel in) {
106                     final BeidouSatelliteEphemeris.Builder beidouSatelliteEphemeris =
107                             new Builder()
108                                     .setSvid(in.readInt())
109                                     .setSatelliteClockModel(
110                                             in.readTypedObject(BeidouSatelliteClockModel.CREATOR))
111                                     .setSatelliteOrbitModel(
112                                             in.readTypedObject(KeplerianOrbitModel.CREATOR))
113                                     .setSatelliteHealth(
114                                             in.readTypedObject(BeidouSatelliteHealth.CREATOR))
115                                     .setSatelliteEphemerisTime(
116                                             in.readTypedObject(
117                                                     BeidouSatelliteEphemerisTime.CREATOR));
118                     return beidouSatelliteEphemeris.build();
119                 }
120 
121                 @Override
122                 public BeidouSatelliteEphemeris[] newArray(int size) {
123                     return new BeidouSatelliteEphemeris[size];
124                 }
125             };
126 
127     @Override
describeContents()128     public int describeContents() {
129         return 0;
130     }
131 
132     @Override
writeToParcel(@onNull Parcel parcel, int flags)133     public void writeToParcel(@NonNull Parcel parcel, int flags) {
134         parcel.writeInt(mSvid);
135         parcel.writeTypedObject(mSatelliteClockModel, flags);
136         parcel.writeTypedObject(mSatelliteOrbitModel, flags);
137         parcel.writeTypedObject(mSatelliteHealth, flags);
138         parcel.writeTypedObject(mSatelliteEphemerisTime, flags);
139     }
140 
141     @Override
142     @NonNull
toString()143     public String toString() {
144         StringBuilder builder = new StringBuilder("BeidouSatelliteEphemeris[");
145         builder.append("svid = ").append(mSvid);
146         builder.append(", satelliteClockModel = ").append(mSatelliteClockModel);
147         builder.append(", satelliteOrbitModel = ").append(mSatelliteOrbitModel);
148         builder.append(", satelliteHealth = ").append(mSatelliteHealth);
149         builder.append(", satelliteEphemerisTime = ").append(mSatelliteEphemerisTime);
150         builder.append("]");
151         return builder.toString();
152     }
153 
154     /** Builder for {@link BeidouSatelliteEphemeris} */
155     public static final class Builder {
156         private int mSvid;
157         private BeidouSatelliteClockModel mSatelliteClockModel;
158         private KeplerianOrbitModel mSatelliteOrbitModel;
159         private BeidouSatelliteHealth mSatelliteHealth;
160         private BeidouSatelliteEphemerisTime mSatelliteEphemerisTime;
161 
162         /** Sets the PRN or satellite ID number for the Beidou satellite. */
163         @NonNull
setSvid(int svid)164         public Builder setSvid(int svid) {
165             mSvid = svid;
166             return this;
167         }
168 
169         /** Sets the satellite clock model. */
170         @NonNull
setSatelliteClockModel( @onNull BeidouSatelliteClockModel satelliteClockModel)171         public Builder setSatelliteClockModel(
172                 @NonNull BeidouSatelliteClockModel satelliteClockModel) {
173             mSatelliteClockModel = satelliteClockModel;
174             return this;
175         }
176 
177         /** Sets the satellite orbit model. */
178         @NonNull
setSatelliteOrbitModel(@onNull KeplerianOrbitModel satelliteOrbitModel)179         public Builder setSatelliteOrbitModel(@NonNull KeplerianOrbitModel satelliteOrbitModel) {
180             mSatelliteOrbitModel = satelliteOrbitModel;
181             return this;
182         }
183 
184         /** Sets the satellite health. */
185         @NonNull
setSatelliteHealth(@onNull BeidouSatelliteHealth satelliteHealth)186         public Builder setSatelliteHealth(@NonNull BeidouSatelliteHealth satelliteHealth) {
187             mSatelliteHealth = satelliteHealth;
188             return this;
189         }
190 
191         /** Sets the satellite ephemeris time. */
192         @NonNull
setSatelliteEphemerisTime( @onNull BeidouSatelliteEphemerisTime satelliteEphemerisTime)193         public Builder setSatelliteEphemerisTime(
194                 @NonNull BeidouSatelliteEphemerisTime satelliteEphemerisTime) {
195             mSatelliteEphemerisTime = satelliteEphemerisTime;
196             return this;
197         }
198 
199         /** Builds a {@link BeidouSatelliteEphemeris} instance as specified by this builder. */
200         @NonNull
build()201         public BeidouSatelliteEphemeris build() {
202             return new BeidouSatelliteEphemeris(this);
203         }
204     }
205 
206     /**
207      * A class contains the set of parameters needed for Beidou satellite clock correction.
208      *
209      * <p>This is defined in BDS-SIS-ICD-B1I-3.0, section 5.2.4.9, 5.2.4.10.
210      */
211     public static final class BeidouSatelliteClockModel implements Parcelable {
212         /**
213          * Time of the clock in seconds since Beidou epoch.
214          *
215          * <p>Corresponds to the 'Epoch' field within the 'SV/EPOCH/SV CLK' record of Beidou
216          * navigation message in RINEX 3.05 Table A14.
217          */
218         private final long mTimeOfClockSeconds;
219 
220         /** SV clock bias in seconds. */
221         private final double mAf0;
222 
223         /** SV clock drift in seconds per second. */
224         private final double mAf1;
225 
226         /** SV clock drift in seconds per second squared. */
227         private final double mAf2;
228 
229         /** Group delay differential 1 B1/B3 in seconds. */
230         private final double mTgd1;
231 
232         /** Group delay differential 2 B2/B3 in seconds. */
233         private final double mTgd2;
234 
235         /**
236          * Age of Data Clock.
237          * <p>This is defined in BDS-SIS-ICD-B1I-3.0 Section 5.2.4.8 Table 5-6.
238          */
239         private final int mAodc;
240 
BeidouSatelliteClockModel(Builder builder)241         private BeidouSatelliteClockModel(Builder builder) {
242             Preconditions.checkArgument(builder.mTimeOfClockSeconds >= 0);
243             Preconditions.checkArgumentInRange(builder.mAf0, -9.77e-3f, 9.77e-3f, "Af0");
244             Preconditions.checkArgumentInRange(builder.mAf1, -1.87e-9f, 1.87e-9f, "Af1");
245             Preconditions.checkArgumentInRange(builder.mAf2, -1.39e-17f, 1.39e-17f, "Af2");
246             Preconditions.checkArgumentInRange(builder.mTgd1, -5.12e-8f, 5.12e-8f, "Tgd1");
247             Preconditions.checkArgumentInRange(builder.mTgd2, -5.12e-8f, 5.12e-8f, "Tgd2");
248             Preconditions.checkArgumentInRange(builder.mAodc, 0, 31, "Aodc");
249             mTimeOfClockSeconds = builder.mTimeOfClockSeconds;
250             mAf0 = builder.mAf0;
251             mAf1 = builder.mAf1;
252             mAf2 = builder.mAf2;
253             mTgd1 = builder.mTgd1;
254             mTgd2 = builder.mTgd2;
255             mAodc = builder.mAodc;
256         }
257 
258         /** Returns the time of the clock in seconds since Beidou epoch. */
259         @IntRange(from = 0)
getTimeOfClockSeconds()260         public long getTimeOfClockSeconds() {
261             return mTimeOfClockSeconds;
262         }
263 
264         /** Returns the SV clock bias in seconds. */
265         @FloatRange(from = -9.77e-3f, to = 9.77e-3f)
getAf0()266         public double getAf0() {
267             return mAf0;
268         }
269 
270         /** Returns the SV clock drift in seconds per second. */
271         @FloatRange(from = -1.87e-9f, to = 1.87e-9f)
getAf1()272         public double getAf1() {
273             return mAf1;
274         }
275 
276         /** Returns the SV clock drift in seconds per second squared. */
277         @FloatRange(from = -1.39e-17f, to = 1.39e-17f)
getAf2()278         public double getAf2() {
279             return mAf2;
280         }
281 
282         /** Returns the group delay differential 1 B1/B3 in seconds. */
283         @FloatRange(from = -5.12e-8f, to = 5.12e-8f)
getTgd1()284         public double getTgd1() {
285             return mTgd1;
286         }
287 
288         /** Returns the group delay differential 2 B2/B3 in seconds. */
289         @FloatRange(from = -5.12e-8f, to = 5.12e-8f)
getTgd2()290         public double getTgd2() {
291             return mTgd2;
292         }
293 
294         /** Returns the age of data clock. */
295         @IntRange(from = 0, to = 31)
getAodc()296         public int getAodc() {
297             return mAodc;
298         }
299 
300         public static final @NonNull Creator<BeidouSatelliteClockModel> CREATOR =
301                 new Creator<BeidouSatelliteClockModel>() {
302                     @Override
303                     @NonNull
304                     public BeidouSatelliteClockModel createFromParcel(Parcel in) {
305                         final BeidouSatelliteClockModel.Builder beidouSatelliteClockModel =
306                                 new Builder()
307                                         .setTimeOfClockSeconds(in.readLong())
308                                         .setAf0(in.readDouble())
309                                         .setAf1(in.readDouble())
310                                         .setAf2(in.readDouble())
311                                         .setTgd1(in.readDouble())
312                                         .setTgd2(in.readDouble())
313                                         .setAodc(in.readInt());
314                         return beidouSatelliteClockModel.build();
315                     }
316 
317                     @Override
318                     public BeidouSatelliteClockModel[] newArray(int size) {
319                         return new BeidouSatelliteClockModel[size];
320                     }
321                 };
322 
323         @Override
describeContents()324         public int describeContents() {
325             return 0;
326         }
327 
328         @Override
writeToParcel(@onNull Parcel parcel, int flags)329         public void writeToParcel(@NonNull Parcel parcel, int flags) {
330             parcel.writeLong(mTimeOfClockSeconds);
331             parcel.writeDouble(mAf0);
332             parcel.writeDouble(mAf1);
333             parcel.writeDouble(mAf2);
334             parcel.writeDouble(mTgd1);
335             parcel.writeDouble(mTgd2);
336             parcel.writeInt(mAodc);
337         }
338 
339         @Override
340         @NonNull
toString()341         public String toString() {
342             StringBuilder builder = new StringBuilder("BeidouSatelliteClockModel[");
343             builder.append("timeOfClockSeonds = ").append(mTimeOfClockSeconds);
344             builder.append(", af0 = ").append(mAf0);
345             builder.append(", af1 = ").append(mAf1);
346             builder.append(", af2 = ").append(mAf2);
347             builder.append(", tgd1 = ").append(mTgd1);
348             builder.append(", tgd2 = ").append(mTgd2);
349             builder.append(", aodc = ").append(mAodc);
350             return builder.toString();
351         }
352 
353         /** Builder for {@link BeidouSatelliteClockModel} */
354         public static final class Builder {
355             private long mTimeOfClockSeconds;
356             private double mAf0;
357             private double mAf1;
358             private double mAf2;
359             private double mTgd1;
360             private double mTgd2;
361             private int mAodc;
362 
363             /** Sets the time of the clock in seconds since Beidou epoch. */
364             @NonNull
setTimeOfClockSeconds(@ntRangefrom = 0) long timeOfClockSeconds)365             public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
366                 mTimeOfClockSeconds = timeOfClockSeconds;
367                 return this;
368             }
369 
370             /** Sets the SV clock bias in seconds. */
371             @NonNull
setAf0(@loatRangefrom = -9.77e-3f, to = 9.77e-3f)double af0)372             public Builder setAf0(@FloatRange(from = -9.77e-3f, to = 9.77e-3f)double af0) {
373                 mAf0 = af0;
374                 return this;
375             }
376 
377             /** Sets the SV clock drift in seconds per second. */
378             @NonNull
setAf1(@loatRangefrom = -1.87e-9f, to = 1.87e-9f) double af1)379             public Builder setAf1(@FloatRange(from = -1.87e-9f, to = 1.87e-9f) double af1) {
380                 mAf1 = af1;
381                 return this;
382             }
383 
384             /** Sets the SV clock drift in seconds per second squared. */
385             @NonNull
setAf2(@loatRangefrom = -1.39e-17f, to = 1.39e-17f) double af2)386             public Builder setAf2(@FloatRange(from = -1.39e-17f, to = 1.39e-17f) double af2) {
387                 mAf2 = af2;
388                 return this;
389             }
390 
391             /** Sets the group delay differential 1 B1/B3 in seconds. */
392             @NonNull
setTgd1(@loatRangefrom = -5.12e-8f, to = 5.12e-8f) double tgd1)393             public Builder setTgd1(@FloatRange(from = -5.12e-8f, to = 5.12e-8f) double tgd1) {
394                 mTgd1 = tgd1;
395                 return this;
396             }
397 
398             /** Sets the group delay differential 2 B2/B3 in seconds. */
399             @NonNull
setTgd2(@loatRangefrom = -5.12e-8f, to = 5.12e-8f) double tgd2)400             public Builder setTgd2(@FloatRange(from = -5.12e-8f, to = 5.12e-8f) double tgd2) {
401                 mTgd2 = tgd2;
402                 return this;
403             }
404 
405             /** Sets the age of data clock. */
406             @NonNull
setAodc(@ntRangefrom = 0, to = 31) int aodc)407             public Builder setAodc(@IntRange(from = 0, to = 31) int aodc) {
408                 mAodc = aodc;
409                 return this;
410             }
411 
412             /** Builds a {@link BeidouSatelliteClockModel} instance as specified by this builder. */
413             @NonNull
build()414             public BeidouSatelliteClockModel build() {
415                 return new BeidouSatelliteClockModel(this);
416             }
417         }
418     }
419 
420     /** A class contains Beidou satellite health. */
421     public static final class BeidouSatelliteHealth implements Parcelable {
422         /**
423          * The autonomous satellite health flag (SatH1) occupies 1 bit.
424          *
425          * <p>“0” means broadcasting satellite is good and “1” means not.
426          *
427          * <p>This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.6.
428          */
429         private final int mSatH1;
430 
431         /**
432          * SV accuracy in meters.
433          *
434          * <p>This is defined in the "BROADCAST ORBIT - 6" record of RINEX 3.05
435          * Table A14, pp.78.
436          */
437         private final double mSvAccur;
438 
BeidouSatelliteHealth(Builder builder)439         private BeidouSatelliteHealth(Builder builder) {
440             // Allow SatH1 beyond the range to support potential future extensibility.
441             Preconditions.checkArgument(builder.mSatH1 >= 0);
442             Preconditions.checkArgumentInRange(builder.mSvAccur, 0.0f, 8192.0f, "SvAccur");
443             mSatH1 = builder.mSatH1;
444             mSvAccur = builder.mSvAccur;
445         }
446 
447         /** Returns the autonomous satellite health flag (SatH1) */
448         @IntRange(from = 0, to = 1)
getSatH1()449         public int getSatH1() {
450             return mSatH1;
451         }
452 
453         /** Returns the SV accuracy in meters. */
454         @FloatRange(from = 0.0f, to = 8192.0f)
getSvAccur()455         public double getSvAccur() {
456             return mSvAccur;
457         }
458 
459         public static final @NonNull Creator<BeidouSatelliteHealth> CREATOR =
460                 new Creator<BeidouSatelliteHealth>() {
461                     @Override
462                     @NonNull
463                     public BeidouSatelliteHealth createFromParcel(Parcel in) {
464                         final BeidouSatelliteHealth.Builder beidouSatelliteHealth =
465                                 new Builder().setSatH1(in.readInt()).setSvAccur(in.readDouble());
466                         return beidouSatelliteHealth.build();
467                     }
468 
469                     @Override
470                     public BeidouSatelliteHealth[] newArray(int size) {
471                         return new BeidouSatelliteHealth[size];
472                     }
473                 };
474 
475         @Override
describeContents()476         public int describeContents() {
477             return 0;
478         }
479 
480         @Override
writeToParcel(@onNull Parcel parcel, int flags)481         public void writeToParcel(@NonNull Parcel parcel, int flags) {
482             parcel.writeInt(mSatH1);
483             parcel.writeDouble(mSvAccur);
484         }
485 
486         @Override
487         @NonNull
toString()488         public String toString() {
489             StringBuilder builder = new StringBuilder("BeidouSatelliteHealth[");
490             builder.append("satH1 = ").append(mSatH1);
491             builder.append(", svAccur = ").append(mSvAccur);
492             builder.append("]");
493             return builder.toString();
494         }
495 
496         /** Builder for {@link BeidouSatelliteHealth} */
497         public static final class Builder {
498             private int mSatH1;
499             private double mSvAccur;
500 
501             /** Sets the autonomous satellite health flag (SatH1) */
502             @NonNull
setSatH1(int satH1)503             public Builder setSatH1(int satH1) {
504                 mSatH1 = satH1;
505                 return this;
506             }
507 
508             /** Sets the SV accuracy in meters. */
509             @NonNull
setSvAccur(double svAccur)510             public Builder setSvAccur(double svAccur) {
511                 mSvAccur = svAccur;
512                 return this;
513             }
514 
515             /** Builds a {@link BeidouSatelliteHealth} instance as specified by this builder. */
516             @NonNull
build()517             public BeidouSatelliteHealth build() {
518                 return new BeidouSatelliteHealth(this);
519             }
520         }
521     }
522 
523     /** A class contains Beidou satellite ephemeris time. */
524     public static final class BeidouSatelliteEphemerisTime implements Parcelable {
525         /**
526          * AODE Age of Data, Ephemeris.
527          *
528          * <p>This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.11 Table 5-8.
529          */
530         private final int mAode;
531 
532         /** Beidou week number without rollover */
533         private final int mBeidouWeekNumber;
534 
535         /**
536          * Time of ephemeris in seconds.
537          *
538          * <p>This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.12.
539          */
540         private final int mToeSeconds;
541 
BeidouSatelliteEphemerisTime(Builder builder)542         private BeidouSatelliteEphemerisTime(Builder builder) {
543             Preconditions.checkArgumentInRange(builder.mAode, 0, 31, "Aode");
544             Preconditions.checkArgument(builder.mBeidouWeekNumber >= 0);
545             Preconditions.checkArgumentInRange(builder.mToeSeconds, 0, 604792, "ToeSeconds");
546             mAode = builder.mAode;
547             mBeidouWeekNumber = builder.mBeidouWeekNumber;
548             mToeSeconds = builder.mToeSeconds;
549         }
550 
551         /** Returns the AODE Age of Data, Ephemeris. */
552         @IntRange(from = 0, to = 31)
getAode()553         public int getAode() {
554             return mAode;
555         }
556 
557         /** Returns the Beidou week number without rollover . */
558         @IntRange(from = 0)
getBeidouWeekNumber()559         public int getBeidouWeekNumber() {
560             return mBeidouWeekNumber;
561         }
562 
563         /** Returns the time of ephemeris in seconds. */
564         @IntRange(from = 0, to = 604792)
getToeSeconds()565         public int getToeSeconds() {
566             return mToeSeconds;
567         }
568 
569         public static final @NonNull Creator<BeidouSatelliteEphemerisTime> CREATOR =
570                 new Creator<BeidouSatelliteEphemerisTime>() {
571                     @Override
572                     @NonNull
573                     public BeidouSatelliteEphemerisTime createFromParcel(Parcel in) {
574                         final BeidouSatelliteEphemerisTime.Builder beidouSatelliteEphemerisTime =
575                                 new Builder()
576                                         .setAode(in.readInt())
577                                         .setBeidouWeekNumber(in.readInt())
578                                         .setToeSeconds(in.readInt());
579                         return beidouSatelliteEphemerisTime.build();
580                     }
581 
582                     @Override
583                     public BeidouSatelliteEphemerisTime[] newArray(int size) {
584                         return new BeidouSatelliteEphemerisTime[size];
585                     }
586                 };
587 
588         @Override
describeContents()589         public int describeContents() {
590             return 0;
591         }
592 
593         @Override
writeToParcel(@onNull Parcel parcel, int flags)594         public void writeToParcel(@NonNull Parcel parcel, int flags) {
595             parcel.writeInt(mAode);
596             parcel.writeInt(mBeidouWeekNumber);
597             parcel.writeInt(mToeSeconds);
598         }
599 
600         @Override
toString()601         public String toString() {
602             StringBuilder builder = new StringBuilder("BeidouSatelliteEphemerisTime[");
603             builder.append("aode = ").append(mAode);
604             builder.append(", beidouWeekNumber = ").append(mBeidouWeekNumber);
605             builder.append(", toeSeconds = ").append(mToeSeconds);
606             builder.append("]");
607             return builder.toString();
608         }
609 
610         /** Builder for {@link BeidouSatelliteEphemerisTime} */
611         public static final class Builder {
612             private int mAode;
613             private int mBeidouWeekNumber;
614             private int mToeSeconds;
615 
616             /** Sets the AODE Age of Data, Ephemeris. */
617             @NonNull
setAode(int iode)618             public Builder setAode(int iode) {
619                 mAode = iode;
620                 return this;
621             }
622 
623             /** Sets the Beidou week number without rollover */
624             @NonNull
setBeidouWeekNumber( @ntRangefrom = 0) int beidouWeekNumber)625             public Builder setBeidouWeekNumber(
626                     @IntRange(from = 0) int beidouWeekNumber) {
627                 mBeidouWeekNumber = beidouWeekNumber;
628                 return this;
629             }
630 
631             /** Sets the time of ephemeris in seconds. */
632             @NonNull
setToeSeconds(@ntRangefrom = 0, to = 604792) int toeSeconds)633             public Builder setToeSeconds(@IntRange(from = 0, to = 604792) int toeSeconds) {
634                 mToeSeconds = toeSeconds;
635                 return this;
636             }
637 
638             /**
639              * Builds a {@link BeidouSatelliteEphemerisTime} instance as specified by this builder.
640              */
641             @NonNull
build()642             public BeidouSatelliteEphemerisTime build() {
643                 return new BeidouSatelliteEphemerisTime(this);
644             }
645         }
646     }
647 }
648