blob: d239c876f70234e89f1209995987d14103af0740 [file] [log] [blame]
/*
* 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);
}
}
}