blob: 2031929514f3f0d7808cb7dedba68c36b42060aa [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.location;
import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* A class that contains GNSS satellite position, velocity and time information at the
* same signal transmission time {@link GnssMeasurement#getReceivedSvTimeNanos()}.
*
* <p>The position and velocity must be in ECEF coordinates.
*
* <p>If {@link GnssMeasurement#getSatellitePvt()} is derived from Broadcast ephemeris, then the
* position is already w.r.t. the antenna phase center. However, if
* {@link GnssMeasurement#getSatellitePvt()} is derived from other modeled orbits, such as
* long-term orbits, or precise orbits, then the orbits may have been computed w.r.t.
* the satellite center of mass, and then GNSS vendors are expected to correct for the effect
* on different phase centers (can differ by meters) of different GNSS signals (e.g. L1, L5)
* on the reported satellite position. Accordingly, we might observe a different satellite
* position reported for L1 GnssMeasurement struct compared to L5 GnssMeasurement struct.
*
* <p>If {@link GnssMeasurement#getReceivedSvTimeNanos()} is not fully decoded,
* {@link GnssMeasurement#getSatellitePvt()} could still be reported and
* {@link GnssMeasurement#getReceivedSvTimeUncertaintyNanos()} would be used to provide confidence.
* @hide
*/
@SystemApi
public final class SatellitePvt implements Parcelable {
/**
* Bit mask for {@link #mFlags} indicating valid satellite position, velocity and clock info
* fields are stored in the SatellitePvt.
*/
private static final int HAS_POSITION_VELOCITY_CLOCK_INFO = 1 << 0;
/**
* Bit mask for {@link #mFlags} indicating a valid iono delay field is stored in the
* SatellitePvt.
*/
private static final int HAS_IONO = 1 << 1;
/**
* Bit mask for {@link #mFlags} indicating a valid tropo delay field is stored in the
* SatellitePvt.
*/
private static final int HAS_TROPO = 1 << 2;
/**
* Bit mask for {@link #mFlags} indicating a valid Issue of Data, Clock field is stored in the
* SatellitePvt.
*/
private static final int HAS_ISSUE_OF_DATA_CLOCK = 1 << 3;
/**
* Bit mask for {@link #mFlags} indicating a valid Issue of Data, Ephemeris field is stored in
* the SatellitePvt.
*/
private static final int HAS_ISSUE_OF_DATA_EPHEMERIS = 1 << 4;
/**
* Bit mask for {@link #mFlags} indicating a valid Time of Clock field is stored in the
* SatellitePvt.
*/
private static final int HAS_TIME_OF_CLOCK = 1 << 5;
/**
* Bit mask for {@link #mFlags} indicating a valid Time of Ephemeris field is stored in
* the SatellitePvt.
*/
private static final int HAS_TIME_OF_EPHEMERIS = 1 << 6;
/** Ephemeris demodulated from broadcast signals */
public static final int EPHEMERIS_SOURCE_DEMODULATED = 0;
/**
* Server provided Normal type ephemeris data, which is similar to broadcast ephemeris in
* longevity (e.g. SUPL) - lasting for few hours and providing satellite orbit and clock
* with accuracy of 1 - 2 meters.
*/
public static final int EPHEMERIS_SOURCE_SERVER_NORMAL = 1;
/**
* Server provided Long-Term type ephemeris data, which lasts for many hours to several days
* and often provides satellite orbit and clock accuracy of 2 - 20 meters.
*/
public static final int EPHEMERIS_SOURCE_SERVER_LONG_TERM = 2;
/** Other ephemeris source */
public static final int EPHEMERIS_SOURCE_OTHER = 3;
/**
* Satellite ephemeris source
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({EPHEMERIS_SOURCE_DEMODULATED, EPHEMERIS_SOURCE_SERVER_NORMAL,
EPHEMERIS_SOURCE_SERVER_LONG_TERM, EPHEMERIS_SOURCE_OTHER})
public @interface EphemerisSource {
}
/**
* A bitfield of flags indicating the validity of the fields in this SatellitePvt.
* The bit masks are defined in the constants with prefix HAS_*
*
* <p>Fields for which there is no corresponding flag must be filled in with a valid value.
* For convenience, these are marked as mandatory.
*
* <p>Others fields may have invalid information in them, if not marked as valid by the
* corresponding bit in flags.
*/
private final int mFlags;
@Nullable
private final PositionEcef mPositionEcef;
@Nullable
private final VelocityEcef mVelocityEcef;
@Nullable
private final ClockInfo mClockInfo;
private final double mIonoDelayMeters;
private final double mTropoDelayMeters;
private final long mTimeOfClockSeconds;
private final long mTimeOfEphemerisSeconds;
private final int mIssueOfDataClock;
private final int mIssueOfDataEphemeris;
@EphemerisSource
private final int mEphemerisSource;
/**
* Class containing estimates of the satellite position fields in ECEF coordinate frame.
*
* <p>The satellite position must be defined at the time of transmission of the signal
* receivedSvTimeNs.
*/
public static final class PositionEcef implements Parcelable {
private final double mXMeters;
private final double mYMeters;
private final double mZMeters;
private final double mUreMeters;
public PositionEcef(
double xMeters,
double yMeters,
double zMeters,
double ureMeters) {
mXMeters = xMeters;
mYMeters = yMeters;
mZMeters = zMeters;
mUreMeters = ureMeters;
}
public static final @NonNull Creator<PositionEcef> CREATOR =
new Creator<PositionEcef>() {
@Override
public PositionEcef createFromParcel(Parcel in) {
return new PositionEcef(
in.readDouble(),
in.readDouble(),
in.readDouble(),
in.readDouble()
);
}
@Override
public PositionEcef[] newArray(int size) {
return new PositionEcef[size];
}
};
/**
* Returns the satellite position X in WGS84 ECEF (meters).
*/
@FloatRange()
public double getXMeters() {
return mXMeters;
}
/**
* Returns the satellite position Y in WGS84 ECEF (meters).
*/
@FloatRange()
public double getYMeters() {
return mYMeters;
}
/**
* Returns the satellite position Z in WGS84 ECEF (meters).
*/
@FloatRange()
public double getZMeters() {
return mZMeters;
}
/**
* Returns the signal in Space User Range Error (URE) (meters).
*/
@FloatRange(from = 0.0f, fromInclusive = false)
public double getUreMeters() {
return mUreMeters;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeDouble(mXMeters);
dest.writeDouble(mYMeters);
dest.writeDouble(mZMeters);
dest.writeDouble(mUreMeters);
}
@Override
public String toString() {
return "PositionEcef{"
+ "xMeters=" + mXMeters
+ ", yMeters=" + mYMeters
+ ", zMeters=" + mZMeters
+ ", ureMeters=" + mUreMeters
+ "}";
}
}
/**
* Class containing estimates of the satellite velocity fields in the ECEF coordinate frame.
*
* <p>The satellite velocity must be defined at the time of transmission of the signal
* receivedSvTimeNs.
*/
public static final class VelocityEcef implements Parcelable {
private final double mXMetersPerSecond;
private final double mYMetersPerSecond;
private final double mZMetersPerSecond;
private final double mUreRateMetersPerSecond;
public VelocityEcef(
double xMetersPerSecond,
double yMetersPerSecond,
double zMetersPerSecond,
double ureRateMetersPerSecond) {
mXMetersPerSecond = xMetersPerSecond;
mYMetersPerSecond = yMetersPerSecond;
mZMetersPerSecond = zMetersPerSecond;
mUreRateMetersPerSecond = ureRateMetersPerSecond;
}
public static final @NonNull Creator<VelocityEcef> CREATOR =
new Creator<VelocityEcef>() {
@Override
public VelocityEcef createFromParcel(Parcel in) {
return new VelocityEcef(
in.readDouble(),
in.readDouble(),
in.readDouble(),
in.readDouble()
);
}
@Override
public VelocityEcef[] newArray(int size) {
return new VelocityEcef[size];
}
};
/**
* Returns the satellite velocity X in WGS84 ECEF (meters per second).
*/
@FloatRange()
public double getXMetersPerSecond() {
return mXMetersPerSecond;
}
/**
* Returns the satellite velocity Y in WGS84 ECEF (meters per second).
*/
@FloatRange()
public double getYMetersPerSecond() {
return mYMetersPerSecond;
}
/**
*Returns the satellite velocity Z in WGS84 ECEF (meters per second).
*/
@FloatRange()
public double getZMetersPerSecond() {
return mZMetersPerSecond;
}
/**
* Returns the signal in Space User Range Error Rate (URE Rate) (meters per second).
*
* <p>It covers satellite velocity error and Satellite clock drift
* projected to the pseudorange rate measurements.
*/
@FloatRange(from = 0.0f, fromInclusive = false)
public double getUreRateMetersPerSecond() {
return mUreRateMetersPerSecond;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeDouble(mXMetersPerSecond);
dest.writeDouble(mYMetersPerSecond);
dest.writeDouble(mZMetersPerSecond);
dest.writeDouble(mUreRateMetersPerSecond);
}
@Override
public String toString() {
return "VelocityEcef{"
+ "xMetersPerSecond=" + mXMetersPerSecond
+ ", yMetersPerSecond=" + mYMetersPerSecond
+ ", zMetersPerSecond=" + mZMetersPerSecond
+ ", ureRateMetersPerSecond=" + mUreRateMetersPerSecond
+ "}";
}
}
/**
* Class containing estimates of the satellite clock info.
*/
public static final class ClockInfo implements Parcelable {
private final double mHardwareCodeBiasMeters;
private final double mTimeCorrectionMeters;
private final double mClockDriftMetersPerSecond;
public ClockInfo(
double hardwareCodeBiasMeters,
double timeCorrectionMeters,
double clockDriftMetersPerSecond) {
mHardwareCodeBiasMeters = hardwareCodeBiasMeters;
mTimeCorrectionMeters = timeCorrectionMeters;
mClockDriftMetersPerSecond = clockDriftMetersPerSecond;
}
public static final @NonNull Creator<ClockInfo> CREATOR =
new Creator<ClockInfo>() {
@Override
public ClockInfo createFromParcel(Parcel in) {
return new ClockInfo(
in.readDouble(),
in.readDouble(),
in.readDouble()
);
}
@Override
public ClockInfo[] newArray(int size) {
return new ClockInfo[size];
}
};
/**
* Returns the satellite hardware code bias of the reported code type w.r.t
* ionosphere-free measurement in meters.
*
* <p>When broadcast ephemeris is used, this is the offset caused
* by the satellite hardware delays at different frequencies;
* e.g. in IS-GPS-705D, this term is described in Section
* 20.3.3.3.1.2.1.
*
* <p>For GPS this term is ~10ns, and affects the satellite position
* computation by less than a millimeter.
*/
@FloatRange()
public double getHardwareCodeBiasMeters() {
return mHardwareCodeBiasMeters;
}
/**
* Returns the satellite time correction for ionospheric-free signal measurement
* (meters). The satellite clock correction for the given signal type
* = satTimeCorrectionMeters - satHardwareCodeBiasMeters.
*
* <p>When broadcast ephemeris is used, this is the offset modeled in the
* clock terms broadcast over the air by the satellites;
* e.g. in IS-GPS-200H, Section 20.3.3.3.3.1, this term is
* ∆tsv = af0 + af1(t - toc) + af2(t - toc)^2 + ∆tr.
*
* <p>If another source of ephemeris is used for SatellitePvt, then the
* equivalent value of satTimeCorrection must be provided.
*
* <p>For GPS this term is ~1ms, and affects the satellite position
* computation by ~1m.
*/
@FloatRange()
public double getTimeCorrectionMeters() {
return mTimeCorrectionMeters;
}
/**
* Returns the satellite clock drift (meters per second).
*/
@FloatRange()
public double getClockDriftMetersPerSecond() {
return mClockDriftMetersPerSecond;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeDouble(mHardwareCodeBiasMeters);
dest.writeDouble(mTimeCorrectionMeters);
dest.writeDouble(mClockDriftMetersPerSecond);
}
@Override
public String toString() {
return "ClockInfo{"
+ "hardwareCodeBiasMeters=" + mHardwareCodeBiasMeters
+ ", timeCorrectionMeters=" + mTimeCorrectionMeters
+ ", clockDriftMetersPerSecond=" + mClockDriftMetersPerSecond
+ "}";
}
}
private SatellitePvt(
int flags,
@Nullable PositionEcef positionEcef,
@Nullable VelocityEcef velocityEcef,
@Nullable ClockInfo clockInfo,
double ionoDelayMeters,
double tropoDelayMeters,
long timeOfClockSeconds,
long timeOfEphemerisSeconds,
int issueOfDataClock,
int issueOfDataEphemeris,
@EphemerisSource int ephemerisSource) {
mFlags = flags;
mPositionEcef = positionEcef;
mVelocityEcef = velocityEcef;
mClockInfo = clockInfo;
mIonoDelayMeters = ionoDelayMeters;
mTropoDelayMeters = tropoDelayMeters;
mTimeOfClockSeconds = timeOfClockSeconds;
mTimeOfEphemerisSeconds = timeOfEphemerisSeconds;
mIssueOfDataClock = issueOfDataClock;
mIssueOfDataEphemeris = issueOfDataEphemeris;
mEphemerisSource = ephemerisSource;
}
/**
* Returns a {@link PositionEcef} object that contains estimates of the satellite
* position fields in ECEF coordinate frame.
*/
@Nullable
public PositionEcef getPositionEcef() {
return mPositionEcef;
}
/**
* Returns a {@link VelocityEcef} object that contains estimates of the satellite
* velocity fields in the ECEF coordinate frame.
*/
@Nullable
public VelocityEcef getVelocityEcef() {
return mVelocityEcef;
}
/**
* Returns a {@link ClockInfo} object that contains estimates of the satellite
* clock info.
*/
@Nullable
public ClockInfo getClockInfo() {
return mClockInfo;
}
/**
* Returns the ionospheric delay in meters.
*/
@FloatRange()
public double getIonoDelayMeters() {
return mIonoDelayMeters;
}
/**
* Returns the tropospheric delay in meters.
*/
@FloatRange()
public double getTropoDelayMeters() {
return mTropoDelayMeters;
}
/**
* Issue of Data, Clock.
*
* <p>This is defined in GPS ICD200 documentation (e.g.,
* <a href="https://www.gps.gov/technical/icwg/IS-GPS-200H.pdf"></a>).
*
* <p>This field is valid if {@link #hasIssueOfDataClock()} is true.
*/
@IntRange(from = 0, to = 1023)
public int getIssueOfDataClock() {
return mIssueOfDataClock;
}
/**
* Issue of Data, Ephemeris.
*
* <p>This is defined in GPS ICD200 documentation (e.g.,
* <a href="https://www.gps.gov/technical/icwg/IS-GPS-200H.pdf"></a>).
*
* <p>This field is valid if {@link #hasIssueOfDataEphemeris()} is true.
*/
@IntRange(from = 0, to = 1023)
public int getIssueOfDataEphemeris() {
return mIssueOfDataEphemeris;
}
/**
* Time of Clock in seconds.
*
* <p>The value is in seconds since GPS epoch, regardless of the constellation.
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
* <p>This field is valid if {@link #hasTimeOfClockSeconds()} is true.
*/
@IntRange(from = 0)
public long getTimeOfClockSeconds() {
return mTimeOfClockSeconds;
}
/**
* Time of ephemeris in seconds.
*
* <p>The value is in seconds since GPS epoch, regardless of the constellation.
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
* <p>This field is valid if {@link #hasTimeOfEphemerisSeconds()} is true.
*/
@IntRange(from = 0)
public long getTimeOfEphemerisSeconds() {
return mTimeOfEphemerisSeconds;
}
/**
* Satellite ephemeris source.
*/
@EphemerisSource
public int getEphemerisSource() {
return mEphemerisSource;
}
/** Returns {@code true} if {@link #getPositionEcef()}, {@link #getVelocityEcef()},
* and {@link #getClockInfo()} are valid.
*/
public boolean hasPositionVelocityClockInfo() {
return (mFlags & HAS_POSITION_VELOCITY_CLOCK_INFO) != 0;
}
/** Returns {@code true} if {@link #getIonoDelayMeters()} is valid. */
public boolean hasIono() {
return (mFlags & HAS_IONO) != 0;
}
/** Returns {@code true} if {@link #getTropoDelayMeters()} is valid. */
public boolean hasTropo() {
return (mFlags & HAS_TROPO) != 0;
}
/** Returns {@code true} if {@link #getIssueOfDataClock()} is valid. */
public boolean hasIssueOfDataClock() {
return (mFlags & HAS_ISSUE_OF_DATA_CLOCK) != 0;
}
/** Returns {@code true} if {@link #getIssueOfDataEphemeris()} is valid. */
public boolean hasIssueOfDataEphemeris() {
return (mFlags & HAS_ISSUE_OF_DATA_EPHEMERIS) != 0;
}
/** Returns {@code true} if {@link #getTimeOfClockSeconds()} ()} is valid. */
public boolean hasTimeOfClockSeconds() {
return (mFlags & HAS_TIME_OF_CLOCK) != 0;
}
/** Returns {@code true} if {@link #getTimeOfEphemerisSeconds()} is valid. */
public boolean hasTimeOfEphemerisSeconds() {
return (mFlags & HAS_TIME_OF_EPHEMERIS) != 0;
}
public static final @android.annotation.NonNull Creator<SatellitePvt> CREATOR =
new Creator<SatellitePvt>() {
@Override
@Nullable
public SatellitePvt createFromParcel(Parcel in) {
int flags = in.readInt();
ClassLoader classLoader = getClass().getClassLoader();
PositionEcef positionEcef = in.readParcelable(classLoader,
android.location.SatellitePvt.PositionEcef.class);
VelocityEcef velocityEcef = in.readParcelable(classLoader,
android.location.SatellitePvt.VelocityEcef.class);
ClockInfo clockInfo = in.readParcelable(classLoader,
android.location.SatellitePvt.ClockInfo.class);
double ionoDelayMeters = in.readDouble();
double tropoDelayMeters = in.readDouble();
long toc = in.readLong();
long toe = in.readLong();
int iodc = in.readInt();
int iode = in.readInt();
int ephemerisSource = in.readInt();
return new SatellitePvt(
flags,
positionEcef,
velocityEcef,
clockInfo,
ionoDelayMeters,
tropoDelayMeters,
toc,
toe,
iodc,
iode,
ephemerisSource);
}
@Override
public SatellitePvt[] newArray(int size) {
return new SatellitePvt[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeInt(mFlags);
parcel.writeParcelable(mPositionEcef, flags);
parcel.writeParcelable(mVelocityEcef, flags);
parcel.writeParcelable(mClockInfo, flags);
parcel.writeDouble(mIonoDelayMeters);
parcel.writeDouble(mTropoDelayMeters);
parcel.writeLong(mTimeOfClockSeconds);
parcel.writeLong(mTimeOfEphemerisSeconds);
parcel.writeInt(mIssueOfDataClock);
parcel.writeInt(mIssueOfDataEphemeris);
parcel.writeInt(mEphemerisSource);
}
@Override
public String toString() {
return "SatellitePvt["
+ "Flags=" + mFlags
+ ", PositionEcef=" + mPositionEcef
+ ", VelocityEcef=" + mVelocityEcef
+ ", ClockInfo=" + mClockInfo
+ ", IonoDelayMeters=" + mIonoDelayMeters
+ ", TropoDelayMeters=" + mTropoDelayMeters
+ ", TimeOfClockSeconds=" + mTimeOfClockSeconds
+ ", TimeOfEphemerisSeconds=" + mTimeOfEphemerisSeconds
+ ", IssueOfDataClock=" + mIssueOfDataClock
+ ", IssueOfDataEphemeris=" + mIssueOfDataEphemeris
+ ", EphemerisSource=" + mEphemerisSource
+ "]";
}
/**
* Builder class for SatellitePvt.
*/
public static final class Builder {
/**
* For documentation of below fields, see corresponding fields in {@link
* SatellitePvt}.
*/
private int mFlags;
@Nullable private PositionEcef mPositionEcef;
@Nullable private VelocityEcef mVelocityEcef;
@Nullable private ClockInfo mClockInfo;
private double mIonoDelayMeters;
private double mTropoDelayMeters;
private long mTimeOfClockSeconds;
private long mTimeOfEphemerisSeconds;
private int mIssueOfDataClock;
private int mIssueOfDataEphemeris;
@EphemerisSource
private int mEphemerisSource = EPHEMERIS_SOURCE_OTHER;
/**
* Set position ECEF.
*
* @param positionEcef position ECEF object
* @return builder object
*/
@NonNull
public Builder setPositionEcef(@NonNull PositionEcef positionEcef) {
mPositionEcef = positionEcef;
updateFlags();
return this;
}
/**
* Set velocity ECEF.
*
* @param velocityEcef velocity ECEF object
* @return builder object
*/
@NonNull
public Builder setVelocityEcef(@NonNull VelocityEcef velocityEcef) {
mVelocityEcef = velocityEcef;
updateFlags();
return this;
}
/**
* Set clock info.
*
* @param clockInfo clock info object
* @return builder object
*/
@NonNull
public Builder setClockInfo(@NonNull ClockInfo clockInfo) {
mClockInfo = clockInfo;
updateFlags();
return this;
}
private void updateFlags() {
if (mPositionEcef != null && mVelocityEcef != null && mClockInfo != null) {
mFlags = (byte) (mFlags | HAS_POSITION_VELOCITY_CLOCK_INFO);
}
}
/**
* Set ionospheric delay in meters.
*
* @param ionoDelayMeters ionospheric delay (meters)
* @return builder object
*/
@NonNull
public Builder setIonoDelayMeters(
@FloatRange(from = 0.0f, to = 100.0f) double ionoDelayMeters) {
mIonoDelayMeters = ionoDelayMeters;
mFlags = (byte) (mFlags | HAS_IONO);
return this;
}
/**
* Set tropospheric delay in meters.
*
* @param tropoDelayMeters tropospheric delay (meters)
* @return builder object
*/
@NonNull
public Builder setTropoDelayMeters(
@FloatRange(from = 0.0f, to = 100.0f) double tropoDelayMeters) {
mTropoDelayMeters = tropoDelayMeters;
mFlags = (byte) (mFlags | HAS_TROPO);
return this;
}
/**
* Set time of clock in seconds.
*
* <p>The value is in seconds since GPS epoch, regardless of the constellation.
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
* @param timeOfClockSeconds time of clock (seconds)
* @return builder object
*/
@NonNull
public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
Preconditions.checkArgumentNonnegative(timeOfClockSeconds);
mTimeOfClockSeconds = timeOfClockSeconds;
mFlags = (byte) (mFlags | HAS_TIME_OF_CLOCK);
return this;
}
/**
* Set time of ephemeris in seconds.
*
* <p>The value is in seconds since GPS epoch, regardless of the constellation.
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
* @param timeOfEphemerisSeconds time of ephemeris (seconds)
* @return builder object
*/
@NonNull
public Builder setTimeOfEphemerisSeconds(@IntRange(from = 0) long timeOfEphemerisSeconds) {
Preconditions.checkArgumentNonnegative(timeOfEphemerisSeconds);
mTimeOfEphemerisSeconds = timeOfEphemerisSeconds;
mFlags = (byte) (mFlags | HAS_TIME_OF_EPHEMERIS);
return this;
}
/**
* Set issue of data, clock.
*
* @param issueOfDataClock issue of data, clock.
* @return builder object
*/
@NonNull
public Builder setIssueOfDataClock(@IntRange(from = 0, to = 1023) int issueOfDataClock) {
Preconditions.checkArgumentInRange(issueOfDataClock, 0, 1023, "issueOfDataClock");
mIssueOfDataClock = issueOfDataClock;
mFlags = (byte) (mFlags | HAS_ISSUE_OF_DATA_CLOCK);
return this;
}
/**
* Set issue of data, ephemeris.
*
* @param issueOfDataEphemeris issue of data, ephemeris.
* @return builder object
*/
@NonNull
public Builder setIssueOfDataEphemeris(
@IntRange(from = 0, to = 1023) int issueOfDataEphemeris) {
Preconditions.checkArgumentInRange(issueOfDataEphemeris, 0, 1023,
"issueOfDataEphemeris");
mIssueOfDataEphemeris = issueOfDataEphemeris;
mFlags = (byte) (mFlags | HAS_ISSUE_OF_DATA_EPHEMERIS);
return this;
}
/**
* Set satellite ephemeris source.
*
* @param ephemerisSource satellite ephemeris source
* @return builder object
*/
@NonNull
public Builder setEphemerisSource(@EphemerisSource int ephemerisSource) {
Preconditions.checkArgument(ephemerisSource == EPHEMERIS_SOURCE_DEMODULATED
|| ephemerisSource == EPHEMERIS_SOURCE_SERVER_NORMAL
|| ephemerisSource == EPHEMERIS_SOURCE_SERVER_LONG_TERM
|| ephemerisSource == EPHEMERIS_SOURCE_OTHER);
mEphemerisSource = ephemerisSource;
return this;
}
/**
* Build SatellitePvt object.
*
* @return instance of SatellitePvt
*/
@NonNull
public SatellitePvt build() {
return new SatellitePvt(mFlags, mPositionEcef, mVelocityEcef, mClockInfo,
mIonoDelayMeters, mTropoDelayMeters, mTimeOfClockSeconds,
mTimeOfEphemerisSeconds,
mIssueOfDataClock, mIssueOfDataEphemeris,
mEphemerisSource);
}
}
}