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