1 /* 2 * Copyright (C) 2012 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.telephony; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 import android.telephony.Rlog; 22 23 /** 24 * LTE signal strength related information. 25 */ 26 public final class CellSignalStrengthLte extends CellSignalStrength implements Parcelable { 27 28 private static final String LOG_TAG = "CellSignalStrengthLte"; 29 private static final boolean DBG = false; 30 31 private int mSignalStrength; 32 private int mRsrp; 33 private int mRsrq; 34 private int mRssnr; 35 private int mCqi; 36 private int mTimingAdvance; 37 38 /** 39 * Empty constructor 40 * 41 * @hide 42 */ 43 public CellSignalStrengthLte() { 44 setDefaultValues(); 45 } 46 47 /** 48 * Constructor 49 * 50 * @hide 51 */ 52 public CellSignalStrengthLte(int signalStrength, int rsrp, int rsrq, int rssnr, int cqi, 53 int timingAdvance) { 54 initialize(signalStrength, rsrp, rsrq, rssnr, cqi, timingAdvance); 55 } 56 57 /** 58 * Copy constructors 59 * 60 * @param s Source SignalStrength 61 * 62 * @hide 63 */ 64 public CellSignalStrengthLte(CellSignalStrengthLte s) { 65 copyFrom(s); 66 } 67 68 /** 69 * Initialize all the values 70 * 71 * @param lteSignalStrength 72 * @param rsrp 73 * @param rsrq 74 * @param rssnr 75 * @param cqi 76 * 77 * @hide 78 */ 79 public void initialize(int lteSignalStrength, int rsrp, int rsrq, int rssnr, int cqi, 80 int timingAdvance) { 81 mSignalStrength = lteSignalStrength; 82 mRsrp = rsrp; 83 mRsrq = rsrq; 84 mRssnr = rssnr; 85 mCqi = cqi; 86 mTimingAdvance = timingAdvance; 87 } 88 89 /** 90 * Initialize from the SignalStrength structure. 91 * 92 * @param ss 93 * 94 * @hide 95 */ 96 public void initialize(SignalStrength ss, int timingAdvance) { 97 mSignalStrength = ss.getLteSignalStrength(); 98 mRsrp = ss.getLteRsrp(); 99 mRsrq = ss.getLteRsrq(); 100 mRssnr = ss.getLteRssnr(); 101 mCqi = ss.getLteCqi(); 102 mTimingAdvance = timingAdvance; 103 } 104 105 /** 106 * @hide 107 */ 108 protected void copyFrom(CellSignalStrengthLte s) { 109 mSignalStrength = s.mSignalStrength; 110 mRsrp = s.mRsrp; 111 mRsrq = s.mRsrq; 112 mRssnr = s.mRssnr; 113 mCqi = s.mCqi; 114 mTimingAdvance = s.mTimingAdvance; 115 } 116 117 /** 118 * @hide 119 */ 120 @Override 121 public CellSignalStrengthLte copy() { 122 return new CellSignalStrengthLte(this); 123 } 124 125 /** @hide */ 126 @Override 127 public void setDefaultValues() { 128 mSignalStrength = Integer.MAX_VALUE; 129 mRsrp = Integer.MAX_VALUE; 130 mRsrq = Integer.MAX_VALUE; 131 mRssnr = Integer.MAX_VALUE; 132 mCqi = Integer.MAX_VALUE; 133 mTimingAdvance = Integer.MAX_VALUE; 134 } 135 136 /** 137 * Get signal level as an int from 0..4 138 */ 139 @Override 140 public int getLevel() { 141 int levelRsrp = 0; 142 int levelRssnr = 0; 143 144 if (mRsrp == Integer.MAX_VALUE) levelRsrp = 0; 145 else if (mRsrp >= -95) levelRsrp = SIGNAL_STRENGTH_GREAT; 146 else if (mRsrp >= -105) levelRsrp = SIGNAL_STRENGTH_GOOD; 147 else if (mRsrp >= -115) levelRsrp = SIGNAL_STRENGTH_MODERATE; 148 else levelRsrp = SIGNAL_STRENGTH_POOR; 149 150 // See RIL_LTE_SignalStrength in ril.h 151 if (mRssnr == Integer.MAX_VALUE) levelRssnr = 0; 152 else if (mRssnr >= 45) levelRssnr = SIGNAL_STRENGTH_GREAT; 153 else if (mRssnr >= 10) levelRssnr = SIGNAL_STRENGTH_GOOD; 154 else if (mRssnr >= -30) levelRssnr = SIGNAL_STRENGTH_MODERATE; 155 else levelRssnr = SIGNAL_STRENGTH_POOR; 156 157 int level; 158 if (mRsrp == Integer.MAX_VALUE) 159 level = levelRssnr; 160 else if (mRssnr == Integer.MAX_VALUE) 161 level = levelRsrp; 162 else 163 level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp; 164 165 if (DBG) log("Lte rsrp level: " + levelRsrp 166 + " snr level: " + levelRssnr + " level: " + level); 167 return level; 168 } 169 170 /** 171 * Get reference signal received quality 172 */ 173 public int getRsrq() { 174 return mRsrq; 175 } 176 177 /** 178 * Get reference signal signal-to-noise ratio 179 */ 180 public int getRssnr() { 181 return mRssnr; 182 } 183 184 /** 185 * Get reference signal received power 186 */ 187 public int getRsrp() { 188 return mRsrp; 189 } 190 191 /** 192 * Get channel quality indicator 193 */ 194 public int getCqi() { 195 return mCqi; 196 } 197 198 /** 199 * Get signal strength as dBm 200 */ 201 @Override 202 public int getDbm() { 203 return mRsrp; 204 } 205 206 /** 207 * Get the LTE signal level as an asu value between 0..97, 99 is unknown 208 * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 209 */ 210 @Override 211 public int getAsuLevel() { 212 int lteAsuLevel = 99; 213 int lteDbm = getDbm(); 214 if (lteDbm == Integer.MAX_VALUE) lteAsuLevel = 99; 215 else if (lteDbm <= -140) lteAsuLevel = 0; 216 else if (lteDbm >= -43) lteAsuLevel = 97; 217 else lteAsuLevel = lteDbm + 140; 218 if (DBG) log("Lte Asu level: "+lteAsuLevel); 219 return lteAsuLevel; 220 } 221 222 /** 223 * Get the timing advance value for LTE, as a value between 0..63. 224 * Integer.MAX_VALUE is reported when there is no active RRC 225 * connection. Refer to 3GPP 36.213 Sec 4.2.3 226 * @return the LTE timing advance, if available. 227 */ 228 public int getTimingAdvance() { 229 return mTimingAdvance; 230 } 231 232 @Override 233 public int hashCode() { 234 int primeNum = 31; 235 return (mSignalStrength * primeNum) + (mRsrp * primeNum) 236 + (mRsrq * primeNum) + (mRssnr * primeNum) + (mCqi * primeNum) 237 + (mTimingAdvance * primeNum); 238 } 239 240 @Override 241 public boolean equals (Object o) { 242 CellSignalStrengthLte s; 243 244 try { 245 s = (CellSignalStrengthLte) o; 246 } catch (ClassCastException ex) { 247 return false; 248 } 249 250 if (o == null) { 251 return false; 252 } 253 254 return mSignalStrength == s.mSignalStrength 255 && mRsrp == s.mRsrp 256 && mRsrq == s.mRsrq 257 && mRssnr == s.mRssnr 258 && mCqi == s.mCqi 259 && mTimingAdvance == s.mTimingAdvance; 260 } 261 262 /** 263 * @return string representation. 264 */ 265 @Override 266 public String toString() { 267 return "CellSignalStrengthLte:" 268 + " ss=" + mSignalStrength 269 + " rsrp=" + mRsrp 270 + " rsrq=" + mRsrq 271 + " rssnr=" + mRssnr 272 + " cqi=" + mCqi 273 + " ta=" + mTimingAdvance; 274 } 275 276 /** Implement the Parcelable interface */ 277 @Override 278 public void writeToParcel(Parcel dest, int flags) { 279 if (DBG) log("writeToParcel(Parcel, int): " + toString()); 280 dest.writeInt(mSignalStrength); 281 // Need to multiply rsrp and rsrq by -1 282 // to ensure consistency when reading values written here 283 // unless the values are invalid 284 dest.writeInt(mRsrp * (mRsrp != Integer.MAX_VALUE ? -1 : 1)); 285 dest.writeInt(mRsrq * (mRsrq != Integer.MAX_VALUE ? -1 : 1)); 286 dest.writeInt(mRssnr); 287 dest.writeInt(mCqi); 288 dest.writeInt(mTimingAdvance); 289 } 290 291 /** 292 * Construct a SignalStrength object from the given parcel 293 * where the token is already been processed. 294 */ 295 private CellSignalStrengthLte(Parcel in) { 296 mSignalStrength = in.readInt(); 297 // rsrp and rsrq are written into the parcel as positive values. 298 // Need to convert into negative values unless the values are invalid 299 mRsrp = in.readInt(); 300 if (mRsrp != Integer.MAX_VALUE) mRsrp *= -1; 301 mRsrq = in.readInt(); 302 if (mRsrq != Integer.MAX_VALUE) mRsrq *= -1; 303 mRssnr = in.readInt(); 304 mCqi = in.readInt(); 305 mTimingAdvance = in.readInt(); 306 if (DBG) log("CellSignalStrengthLte(Parcel): " + toString()); 307 } 308 309 /** Implement the Parcelable interface */ 310 @Override 311 public int describeContents() { 312 return 0; 313 } 314 315 /** Implement the Parcelable interface */ 316 @SuppressWarnings("hiding") 317 public static final Parcelable.Creator<CellSignalStrengthLte> CREATOR = 318 new Parcelable.Creator<CellSignalStrengthLte>() { 319 @Override 320 public CellSignalStrengthLte createFromParcel(Parcel in) { 321 return new CellSignalStrengthLte(in); 322 } 323 324 @Override 325 public CellSignalStrengthLte[] newArray(int size) { 326 return new CellSignalStrengthLte[size]; 327 } 328 }; 329 330 /** 331 * log 332 */ 333 private static void log(String s) { 334 Rlog.w(LOG_TAG, s); 335 } 336 } 337