Jaime Lopez dbf09ffed2 Telephony: Read signal strength values as expected
Telephony framework expects Lte rsrp and rsrq, as well
as dbm and ecio values for cdma and evdoe to be negative.
RIL Interface provides positive values.
Fix that by changing the constructor from Parcel to
also multiply by -1
Writing to parcel also modified for consistency

Bug: 10440827
Change-Id: I6a8112a5b343c5e6c6dc12332a6e9a489b093cc1
2013-10-11 05:05:49 -07:00

303 lines
8.2 KiB
Java

/*
* Copyright (C) 2012 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.telephony;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.Rlog;
/**
* LTE signal strength related information.
*/
public final class CellSignalStrengthLte extends CellSignalStrength implements Parcelable {
private static final String LOG_TAG = "CellSignalStrengthLte";
private static final boolean DBG = false;
private int mSignalStrength;
private int mRsrp;
private int mRsrq;
private int mRssnr;
private int mCqi;
private int mTimingAdvance;
/**
* Empty constructor
*
* @hide
*/
public CellSignalStrengthLte() {
setDefaultValues();
}
/**
* Constructor
*
* @hide
*/
public CellSignalStrengthLte(int signalStrength, int rsrp, int rsrq, int rssnr, int cqi,
int timingAdvance) {
initialize(signalStrength, rsrp, rsrq, rssnr, cqi, timingAdvance);
}
/**
* Copy constructors
*
* @param s Source SignalStrength
*
* @hide
*/
public CellSignalStrengthLte(CellSignalStrengthLte s) {
copyFrom(s);
}
/**
* Initialize all the values
*
* @param lteSignalStrength
* @param rsrp
* @param rsrq
* @param rssnr
* @param cqi
*
* @hide
*/
public void initialize(int lteSignalStrength, int rsrp, int rsrq, int rssnr, int cqi,
int timingAdvance) {
mSignalStrength = lteSignalStrength;
mRsrp = rsrp;
mRsrq = rsrq;
mRssnr = rssnr;
mCqi = cqi;
mTimingAdvance = timingAdvance;
}
/**
* Initialize from the SignalStrength structure.
*
* @param ss
*
* @hide
*/
public void initialize(SignalStrength ss, int timingAdvance) {
mSignalStrength = ss.getLteSignalStrength();
mRsrp = ss.getLteRsrp();
mRsrq = ss.getLteRsrq();
mRssnr = ss.getLteRssnr();
mCqi = ss.getLteCqi();
mTimingAdvance = timingAdvance;
}
/**
* @hide
*/
protected void copyFrom(CellSignalStrengthLte s) {
mSignalStrength = s.mSignalStrength;
mRsrp = s.mRsrp;
mRsrq = s.mRsrq;
mRssnr = s.mRssnr;
mCqi = s.mCqi;
mTimingAdvance = s.mTimingAdvance;
}
/**
* @hide
*/
@Override
public CellSignalStrengthLte copy() {
return new CellSignalStrengthLte(this);
}
/** @hide */
@Override
public void setDefaultValues() {
mSignalStrength = Integer.MAX_VALUE;
mRsrp = Integer.MAX_VALUE;
mRsrq = Integer.MAX_VALUE;
mRssnr = Integer.MAX_VALUE;
mCqi = Integer.MAX_VALUE;
mTimingAdvance = Integer.MAX_VALUE;
}
/**
* Get signal level as an int from 0..4
*/
@Override
public int getLevel() {
int levelRsrp = 0;
int levelRssnr = 0;
if (mRsrp == Integer.MAX_VALUE) levelRsrp = 0;
else if (mRsrp >= -95) levelRsrp = SIGNAL_STRENGTH_GREAT;
else if (mRsrp >= -105) levelRsrp = SIGNAL_STRENGTH_GOOD;
else if (mRsrp >= -115) levelRsrp = SIGNAL_STRENGTH_MODERATE;
else levelRsrp = SIGNAL_STRENGTH_POOR;
// See RIL_LTE_SignalStrength in ril.h
if (mRssnr == Integer.MAX_VALUE) levelRssnr = 0;
else if (mRssnr >= 45) levelRssnr = SIGNAL_STRENGTH_GREAT;
else if (mRssnr >= 10) levelRssnr = SIGNAL_STRENGTH_GOOD;
else if (mRssnr >= -30) levelRssnr = SIGNAL_STRENGTH_MODERATE;
else levelRssnr = SIGNAL_STRENGTH_POOR;
int level;
if (mRsrp == Integer.MAX_VALUE)
level = levelRssnr;
else if (mRssnr == Integer.MAX_VALUE)
level = levelRsrp;
else
level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp;
if (DBG) log("Lte rsrp level: " + levelRsrp
+ " snr level: " + levelRssnr + " level: " + level);
return level;
}
/**
* Get signal strength as dBm
*/
@Override
public int getDbm() {
return mRsrp;
}
/**
* Get the LTE signal level as an asu value between 0..97, 99 is unknown
* Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
*/
@Override
public int getAsuLevel() {
int lteAsuLevel = 99;
int lteDbm = getDbm();
if (lteDbm <= -140) lteAsuLevel = 0;
else if (lteDbm >= -43) lteAsuLevel = 97;
else lteAsuLevel = lteDbm + 140;
if (DBG) log("Lte Asu level: "+lteAsuLevel);
return lteAsuLevel;
}
/**
* Get the timing advance value for LTE.
* See 3GPP xxxx
*/
public int getTimingAdvance() {
return mTimingAdvance;
}
@Override
public int hashCode() {
int primeNum = 31;
return (mSignalStrength * primeNum) + (mRsrp * primeNum)
+ (mRsrq * primeNum) + (mRssnr * primeNum) + (mCqi * primeNum)
+ (mTimingAdvance * primeNum);
}
@Override
public boolean equals (Object o) {
CellSignalStrengthLte s;
try {
s = (CellSignalStrengthLte) o;
} catch (ClassCastException ex) {
return false;
}
if (o == null) {
return false;
}
return mSignalStrength == s.mSignalStrength
&& mRsrp == s.mRsrp
&& mRsrq == s.mRsrq
&& mRssnr == s.mRssnr
&& mCqi == s.mCqi
&& mTimingAdvance == s.mTimingAdvance;
}
/**
* @return string representation.
*/
@Override
public String toString() {
return "CellSignalStrengthLte:"
+ " ss=" + mSignalStrength
+ " rsrp=" + mRsrp
+ " rsrq=" + mRsrq
+ " rssnr=" + mRssnr
+ " cqi=" + mCqi
+ " ta=" + mTimingAdvance;
}
/** Implement the Parcelable interface */
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
dest.writeInt(mSignalStrength);
// Need to multiply rsrp and rsrq by -1
// to ensure consistency when reading values written here
dest.writeInt(mRsrp * -1);
dest.writeInt(mRsrq * -1);
dest.writeInt(mRssnr);
dest.writeInt(mCqi);
dest.writeInt(mTimingAdvance);
}
/**
* Construct a SignalStrength object from the given parcel
* where the token is already been processed.
*/
private CellSignalStrengthLte(Parcel in) {
mSignalStrength = in.readInt();
// rsrp and rsrq are written into the parcel as positive values.
// Need to convert into negative values
mRsrp = in.readInt() * -1;
mRsrq = in.readInt() * -1;
mRssnr = in.readInt();
mCqi = in.readInt();
mTimingAdvance = in.readInt();
if (DBG) log("CellSignalStrengthLte(Parcel): " + toString());
}
/** Implement the Parcelable interface */
@Override
public int describeContents() {
return 0;
}
/** Implement the Parcelable interface */
@SuppressWarnings("hiding")
public static final Parcelable.Creator<CellSignalStrengthLte> CREATOR =
new Parcelable.Creator<CellSignalStrengthLte>() {
@Override
public CellSignalStrengthLte createFromParcel(Parcel in) {
return new CellSignalStrengthLte(in);
}
@Override
public CellSignalStrengthLte[] newArray(int size) {
return new CellSignalStrengthLte[size];
}
};
/**
* log
*/
private static void log(String s) {
Rlog.w(LOG_TAG, s);
}
}