CellSignalStrengthLte.java revision 3caf66d2ea63c75039daf43af30d3727e5ce6b58
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 17package android.telephony; 18 19import android.os.Parcel; 20import android.os.Parcelable; 21import android.util.Log; 22 23/** 24 * LTE signal strength related information. 25 */ 26public 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 * @hide 91 */ 92 protected void copyFrom(CellSignalStrengthLte s) { 93 mSignalStrength = s.mSignalStrength; 94 mRsrp = s.mRsrp; 95 mRsrq = s.mRsrq; 96 mRssnr = s.mRssnr; 97 mCqi = s.mCqi; 98 mTimingAdvance = s.mTimingAdvance; 99 } 100 101 /** 102 * @hide 103 */ 104 @Override 105 public CellSignalStrengthLte copy() { 106 return new CellSignalStrengthLte(this); 107 } 108 109 /** @hide */ 110 @Override 111 public void setDefaultValues() { 112 mSignalStrength = Integer.MAX_VALUE; 113 mRsrp = Integer.MAX_VALUE; 114 mRsrq = Integer.MAX_VALUE; 115 mRssnr = Integer.MAX_VALUE; 116 mCqi = Integer.MAX_VALUE; 117 mTimingAdvance = Integer.MAX_VALUE; 118 } 119 120 /** 121 * Get LTE as level 0..4 122 * 123 * @hide 124 */ 125 @Override 126 public int getLevel() { 127 int levelRsrp = 0; 128 int levelRssnr = 0; 129 130 if (mRsrp == Integer.MAX_VALUE) levelRsrp = 0; 131 else if (mRsrp >= -95) levelRsrp = SIGNAL_STRENGTH_GREAT; 132 else if (mRsrp >= -105) levelRsrp = SIGNAL_STRENGTH_GOOD; 133 else if (mRsrp >= -115) levelRsrp = SIGNAL_STRENGTH_MODERATE; 134 else levelRsrp = SIGNAL_STRENGTH_POOR; 135 136 // See RIL_LTE_SignalStrength in ril.h 137 if (mRssnr == Integer.MAX_VALUE) levelRssnr = 0; 138 else if (mRssnr >= 45) levelRssnr = SIGNAL_STRENGTH_GREAT; 139 else if (mRssnr >= 10) levelRssnr = SIGNAL_STRENGTH_GOOD; 140 else if (mRssnr >= -30) levelRssnr = SIGNAL_STRENGTH_MODERATE; 141 else levelRssnr = SIGNAL_STRENGTH_POOR; 142 143 int level; 144 if (mRsrp == Integer.MAX_VALUE) 145 level = levelRssnr; 146 else if (mRssnr == Integer.MAX_VALUE) 147 level = levelRsrp; 148 else 149 level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp; 150 151 if (DBG) log("Lte rsrp level: " + levelRsrp 152 + " snr level: " + levelRssnr + " level: " + level); 153 return level; 154 } 155 156 /** 157 * Get LTE as dBm 158 * 159 * @hide 160 */ 161 @Override 162 public int getDbm() { 163 return mRsrp; 164 } 165 166 /** 167 * Get the LTE signal level as an asu value between 0..97, 99 is unknown 168 * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 169 * 170 * @hide 171 */ 172 @Override 173 public int getAsuLevel() { 174 int lteAsuLevel = 99; 175 int lteDbm = getDbm(); 176 if (lteDbm <= -140) lteAsuLevel = 0; 177 else if (lteDbm >= -43) lteAsuLevel = 97; 178 else lteAsuLevel = lteDbm + 140; 179 if (DBG) log("Lte Asu level: "+lteAsuLevel); 180 return lteAsuLevel; 181 } 182 183 /** 184 * Get the timing advance value for LTE. 185 * See 3GPP xxxx 186 */ 187 public int getTimingAdvance() { 188 return mTimingAdvance; 189 } 190 191 @Override 192 public int hashCode() { 193 int primeNum = 31; 194 return (mSignalStrength * primeNum) + (mRsrp * primeNum) 195 + (mRsrq * primeNum) + (mRssnr * primeNum) + (mCqi * primeNum) 196 + (mTimingAdvance * primeNum); 197 } 198 199 @Override 200 public boolean equals (Object o) { 201 CellSignalStrengthLte s; 202 203 try { 204 s = (CellSignalStrengthLte) o; 205 } catch (ClassCastException ex) { 206 return false; 207 } 208 209 if (o == null) { 210 return false; 211 } 212 213 return mSignalStrength == s.mSignalStrength 214 && mRsrp == s.mRsrp 215 && mRsrq == s.mRsrq 216 && mRssnr == s.mRssnr 217 && mCqi == s.mCqi 218 && mTimingAdvance == s.mTimingAdvance; 219 } 220 221 /** 222 * @return string representation. 223 */ 224 @Override 225 public String toString() { 226 return "CellSignalStrengthLte:" 227 + " ss=" + mSignalStrength 228 + " rsrp=" + mRsrp 229 + " rsrq=" + mRsrq 230 + " rssnr=" + mRssnr 231 + " cqi=" + mCqi 232 + " ta=" + mTimingAdvance; 233 } 234 235 /** Implement the Parcelable interface */ 236 @Override 237 public void writeToParcel(Parcel dest, int flags) { 238 if (DBG) log("writeToParcel(Parcel, int): " + toString()); 239 dest.writeInt(CellSignalStrength.TYPE_LTE); 240 dest.writeInt(mSignalStrength); 241 dest.writeInt(mRsrp); 242 dest.writeInt(mRsrq); 243 dest.writeInt(mRssnr); 244 dest.writeInt(mCqi); 245 dest.writeInt(mTimingAdvance); 246 } 247 248 /** 249 * Construct a SignalStrength object from the given parcel 250 * where the token is already been processed. 251 */ 252 private CellSignalStrengthLte(Parcel in) { 253 mSignalStrength = in.readInt(); 254 mRsrp = in.readInt(); 255 mRsrq = in.readInt(); 256 mRssnr = in.readInt(); 257 mCqi = in.readInt(); 258 mTimingAdvance = in.readInt(); 259 if (DBG) log("CellSignalStrengthLte(Parcel): " + toString()); 260 } 261 262 /** Implement the Parcelable interface */ 263 @Override 264 public int describeContents() { 265 return 0; 266 } 267 268 /** Implement the Parcelable interface */ 269 @SuppressWarnings("hiding") 270 public static final Parcelable.Creator<CellSignalStrengthLte> CREATOR = 271 new Parcelable.Creator<CellSignalStrengthLte>() { 272 @Override 273 public CellSignalStrengthLte createFromParcel(Parcel in) { 274 if (in.readInt() != CellSignalStrength.TYPE_LTE) { 275 throw new RuntimeException("Expecting TYPE_LTE"); 276 } 277 return createFromParcelBody(in); 278 } 279 280 @Override 281 public CellSignalStrengthLte[] newArray(int size) { 282 return new CellSignalStrengthLte[size]; 283 } 284 }; 285 286 /** @hide */ 287 public static CellSignalStrengthLte createFromParcelBody(Parcel in) { 288 return new CellSignalStrengthLte(in); 289 } 290 291 /** 292 * log 293 */ 294 private static void log(String s) { 295 Log.w(LOG_TAG, s); 296 } 297} 298