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