| /* | |
| * Copyright (C) 2024 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.FlaggedApi; | |
| import android.annotation.FloatRange; | |
| import android.annotation.NonNull; | |
| import android.annotation.SystemApi; | |
| import android.location.flags.Flags; | |
| import android.os.Parcel; | |
| import android.os.Parcelable; | |
| import com.android.internal.util.Preconditions; | |
| /** | |
| * A class contains Klobuchar ionospheric model coefficients used by GPS, BDS, QZSS. | |
| * | |
| * <p>This is defined in IS-GPS-200 section 20.3.3.5.1.7. | |
| * | |
| * @hide | |
| */ | |
| @FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE) | |
| @SystemApi | |
| public final class KlobucharIonosphericModel implements Parcelable { | |
| /** Alpha0 coefficientin seconds. */ | |
| double mAlpha0; | |
| /** Alpha1 coefficient in seconds per semi-circle. */ | |
| double mAlpha1; | |
| /** Alpha2 coefficient in seconds per semi-circle squared. */ | |
| double mAlpha2; | |
| /** Alpha3 coefficient in seconds per semi-circle cubed. */ | |
| double mAlpha3; | |
| /** Beta0 coefficient in seconds. */ | |
| double mBeta0; | |
| /** Beta1 coefficient in seconds per semi-circle. */ | |
| double mBeta1; | |
| /** Beta2 coefficient in seconds per semi-circle squared. */ | |
| double mBeta2; | |
| /** Beta3 coefficient in seconds per semi-circle cubed. */ | |
| double mBeta3; | |
| private KlobucharIonosphericModel(Builder builder) { | |
| Preconditions.checkArgumentInRange(builder.mAlpha0, -1.193e-7f, 1.193e-7f, "Alpha0"); | |
| Preconditions.checkArgumentInRange(builder.mAlpha1, -9.54e-7f, 9.54e-7f, "Alpha1"); | |
| Preconditions.checkArgumentInRange(builder.mAlpha2, -7.63e-6f, 7.63e-6f, "Alpha2"); | |
| Preconditions.checkArgumentInRange(builder.mAlpha3, -7.63e-6f, 7.63e-6f, "Alpha3"); | |
| Preconditions.checkArgumentInRange(builder.mBeta0, -262144.0f, 262144.0f, "Beta0"); | |
| Preconditions.checkArgumentInRange(builder.mBeta1, -2097152.0f, 2097152.0f, "Beta1"); | |
| Preconditions.checkArgumentInRange(builder.mBeta2, -8388608.0f, 8388608.0f, "Beta2"); | |
| Preconditions.checkArgumentInRange(builder.mBeta3, -8388608.0f, 8388608.0f, "Beta3"); | |
| mAlpha0 = builder.mAlpha0; | |
| mAlpha1 = builder.mAlpha1; | |
| mAlpha2 = builder.mAlpha2; | |
| mAlpha3 = builder.mAlpha3; | |
| mBeta0 = builder.mBeta0; | |
| mBeta1 = builder.mBeta1; | |
| mBeta2 = builder.mBeta2; | |
| mBeta3 = builder.mBeta3; | |
| } | |
| /** Returns the alpha0 coefficient in seconds. */ | |
| @FloatRange(from = -1.193e-7f, to = 1.193e-7f) | |
| public double getAlpha0() { | |
| return mAlpha0; | |
| } | |
| /** Returns the alpha1 coefficient in seconds per semi-circle. */ | |
| @FloatRange(from = -9.54e-7f, to = 9.54e-7f) | |
| public double getAlpha1() { | |
| return mAlpha1; | |
| } | |
| /** Returns the alpha2 coefficient in seconds per semi-circle squared. */ | |
| @FloatRange(from = -7.63e-6f, to = 7.63e-6f) | |
| public double getAlpha2() { | |
| return mAlpha2; | |
| } | |
| /** Returns the alpha3 coefficient in seconds per semi-circle cubed. */ | |
| @FloatRange(from = -7.63e-6f, to = 7.63e-6f) | |
| public double getAlpha3() { | |
| return mAlpha3; | |
| } | |
| /** Returns the beta0 coefficient in seconds. */ | |
| @FloatRange(from = -262144.0f, to = 262144.0f) | |
| public double getBeta0() { | |
| return mBeta0; | |
| } | |
| /** Returns the beta1 coefficient in seconds per semi-circle. */ | |
| @FloatRange(from = -2097152.0f, to = 2097152.0f) | |
| public double getBeta1() { | |
| return mBeta1; | |
| } | |
| /** Returns the beta2 coefficient in seconds per semi-circle squared. */ | |
| @FloatRange(from = -8388608.0f, to = 8388608.0f) | |
| public double getBeta2() { | |
| return mBeta2; | |
| } | |
| /** Returns the beta3 coefficient in seconds per semi-circle cubed. */ | |
| @FloatRange(from = -8388608.0f, to = 8388608.0f) | |
| public double getBeta3() { | |
| return mBeta3; | |
| } | |
| public static final @NonNull Creator<KlobucharIonosphericModel> CREATOR = | |
| new Creator<KlobucharIonosphericModel>() { | |
| @Override | |
| @NonNull | |
| public KlobucharIonosphericModel createFromParcel(Parcel in) { | |
| return new KlobucharIonosphericModel.Builder() | |
| .setAlpha0(in.readDouble()) | |
| .setAlpha1(in.readDouble()) | |
| .setAlpha2(in.readDouble()) | |
| .setAlpha3(in.readDouble()) | |
| .setBeta0(in.readDouble()) | |
| .setBeta1(in.readDouble()) | |
| .setBeta2(in.readDouble()) | |
| .setBeta3(in.readDouble()) | |
| .build(); | |
| } | |
| @Override | |
| public KlobucharIonosphericModel[] newArray(int size) { | |
| return new KlobucharIonosphericModel[size]; | |
| } | |
| }; | |
| @Override | |
| public int describeContents() { | |
| return 0; | |
| } | |
| @Override | |
| public void writeToParcel(@NonNull Parcel parcel, int flags) { | |
| parcel.writeDouble(mAlpha0); | |
| parcel.writeDouble(mAlpha1); | |
| parcel.writeDouble(mAlpha2); | |
| parcel.writeDouble(mAlpha3); | |
| parcel.writeDouble(mBeta0); | |
| parcel.writeDouble(mBeta1); | |
| parcel.writeDouble(mBeta2); | |
| parcel.writeDouble(mBeta3); | |
| } | |
| @Override | |
| @NonNull | |
| public String toString() { | |
| StringBuilder builder = new StringBuilder("KlobucharIonosphericModel["); | |
| builder.append("alpha0 = ").append(mAlpha0); | |
| builder.append(", alpha1 = ").append(mAlpha1); | |
| builder.append(", alpha2 = ").append(mAlpha2); | |
| builder.append(", alpha3 = ").append(mAlpha3); | |
| builder.append(", beta0 = ").append(mBeta0); | |
| builder.append(", beta1 = ").append(mBeta1); | |
| builder.append(", beta2 = ").append(mBeta2); | |
| builder.append(", beta3 = ").append(mBeta3); | |
| builder.append("]"); | |
| return builder.toString(); | |
| } | |
| /** Builder for {@link KlobucharIonosphericModel} */ | |
| public static final class Builder { | |
| private double mAlpha0; | |
| private double mAlpha1; | |
| private double mAlpha2; | |
| private double mAlpha3; | |
| private double mBeta0; | |
| private double mBeta1; | |
| private double mBeta2; | |
| private double mBeta3; | |
| /** Sets the alpha0 coefficient in seconds. */ | |
| @NonNull | |
| public Builder setAlpha0(@FloatRange(from = -1.193e-7f, to = 1.193e-7f) double alpha0) { | |
| mAlpha0 = alpha0; | |
| return this; | |
| } | |
| /** Sets the alpha1 coefficient in seconds per semi-circle. */ | |
| @NonNull | |
| public Builder setAlpha1(@FloatRange(from = -9.54e-7f, to = 9.54e-7f) double alpha1) { | |
| mAlpha1 = alpha1; | |
| return this; | |
| } | |
| /** Sets the alpha2 coefficient in seconds per semi-circle squared. */ | |
| @NonNull | |
| public Builder setAlpha2(@FloatRange(from = -7.63e-6f, to = 7.63e-6f) double alpha2) { | |
| mAlpha2 = alpha2; | |
| return this; | |
| } | |
| /** Sets the alpha3 coefficient in seconds per semi-circle cubed. */ | |
| @NonNull | |
| public Builder setAlpha3(@FloatRange(from = -7.63e-6f, to = 7.63e-6f) double alpha3) { | |
| mAlpha3 = alpha3; | |
| return this; | |
| } | |
| /** Sets the beta0 coefficient in seconds. */ | |
| @NonNull | |
| public Builder setBeta0(@FloatRange(from = -262144.0f, to = 262144.0f) double beta0) { | |
| mBeta0 = beta0; | |
| return this; | |
| } | |
| /** Sets the beta1 coefficient in seconds per semi-circle. */ | |
| @NonNull | |
| public Builder setBeta1(@FloatRange(from = -2097152.0f, to = 2097152.0f) double beta1) { | |
| mBeta1 = beta1; | |
| return this; | |
| } | |
| /** Sets the beta2 coefficient in seconds per semi-circle squared. */ | |
| @NonNull | |
| public Builder setBeta2(@FloatRange(from = -8388608.0f, to = 8388608.0f) double beta2) { | |
| mBeta2 = beta2; | |
| return this; | |
| } | |
| /** Sets the beta3 coefficient in seconds per semi-circle cubed. */ | |
| @NonNull | |
| public Builder setBeta3(@FloatRange(from = -8388608.0f, to = 8388608.0f) double beta3) { | |
| mBeta3 = beta3; | |
| return this; | |
| } | |
| /** Builds a {@link KlobucharIonosphericModel} instance as specified by this builder. */ | |
| @NonNull | |
| public KlobucharIonosphericModel build() { | |
| return new KlobucharIonosphericModel(this); | |
| } | |
| } | |
| } |