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 * Signal strength related information. 25 */ 26 public final class CellSignalStrengthCdma extends CellSignalStrength implements Parcelable { 27 28 private static final String LOG_TAG = "CellSignalStrengthCdma"; 29 private static final boolean DBG = false; 30 31 private int mCdmaDbm; // This value is the RSSI value 32 private int mCdmaEcio; // This value is the Ec/Io 33 private int mEvdoDbm; // This value is the EVDO RSSI value 34 private int mEvdoEcio; // This value is the EVDO Ec/Io 35 private int mEvdoSnr; // Valid values are 0-8. 8 is the highest signal to noise ratio 36 37 /** 38 * Empty constructor 39 * 40 * @hide 41 */ CellSignalStrengthCdma()42 public CellSignalStrengthCdma() { 43 setDefaultValues(); 44 } 45 46 /** 47 * Constructor 48 * 49 * @hide 50 */ CellSignalStrengthCdma(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr)51 public CellSignalStrengthCdma(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, 52 int evdoSnr) { 53 initialize(cdmaDbm, cdmaEcio, evdoDbm, evdoEcio, evdoSnr); 54 } 55 56 /** 57 * Copy constructors 58 * 59 * @param s Source SignalStrength 60 * 61 * @hide 62 */ CellSignalStrengthCdma(CellSignalStrengthCdma s)63 public CellSignalStrengthCdma(CellSignalStrengthCdma s) { 64 copyFrom(s); 65 } 66 67 /** 68 * Initialize all the values 69 * 70 * @param cdmaDbm 71 * @param cdmaEcio 72 * @param evdoDbm 73 * @param evdoEcio 74 * @param evdoSnr 75 * 76 * @hide 77 */ initialize(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr)78 public void initialize(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr) { 79 mCdmaDbm = cdmaDbm; 80 mCdmaEcio = cdmaEcio; 81 mEvdoDbm = evdoDbm; 82 mEvdoEcio = evdoEcio; 83 mEvdoSnr = evdoSnr; 84 } 85 86 /** 87 * @hide 88 */ copyFrom(CellSignalStrengthCdma s)89 protected void copyFrom(CellSignalStrengthCdma s) { 90 mCdmaDbm = s.mCdmaDbm; 91 mCdmaEcio = s.mCdmaEcio; 92 mEvdoDbm = s.mEvdoDbm; 93 mEvdoEcio = s.mEvdoEcio; 94 mEvdoSnr = s.mEvdoSnr; 95 } 96 97 /** 98 * @hide 99 */ 100 @Override copy()101 public CellSignalStrengthCdma copy() { 102 return new CellSignalStrengthCdma(this); 103 } 104 105 /** @hide */ 106 @Override setDefaultValues()107 public void setDefaultValues() { 108 mCdmaDbm = Integer.MAX_VALUE; 109 mCdmaEcio = Integer.MAX_VALUE; 110 mEvdoDbm = Integer.MAX_VALUE; 111 mEvdoEcio = Integer.MAX_VALUE; 112 mEvdoSnr = Integer.MAX_VALUE; 113 } 114 115 /** 116 * Get signal level as an int from 0..4 117 */ 118 @Override getLevel()119 public int getLevel() { 120 int level; 121 122 int cdmaLevel = getCdmaLevel(); 123 int evdoLevel = getEvdoLevel(); 124 if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 125 /* We don't know evdo, use cdma */ 126 level = getCdmaLevel(); 127 } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 128 /* We don't know cdma, use evdo */ 129 level = getEvdoLevel(); 130 } else { 131 /* We know both, use the lowest level */ 132 level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel; 133 } 134 if (DBG) log("getLevel=" + level); 135 return level; 136 } 137 138 /** 139 * Get the signal level as an asu value between 0..97, 99 is unknown 140 */ 141 @Override 142 public int getAsuLevel() { 143 final int cdmaDbm = getCdmaDbm(); 144 final int cdmaEcio = getCdmaEcio(); 145 int cdmaAsuLevel; 146 int ecioAsuLevel; 147 148 if (cdmaDbm == Integer.MAX_VALUE) cdmaAsuLevel = 99; 149 else if (cdmaDbm >= -75) cdmaAsuLevel = 16; 150 else if (cdmaDbm >= -82) cdmaAsuLevel = 8; 151 else if (cdmaDbm >= -90) cdmaAsuLevel = 4; 152 else if (cdmaDbm >= -95) cdmaAsuLevel = 2; 153 else if (cdmaDbm >= -100) cdmaAsuLevel = 1; 154 else cdmaAsuLevel = 99; 155 156 // Ec/Io are in dB*10 157 if (cdmaEcio == Integer.MAX_VALUE) ecioAsuLevel = 99; 158 else if (cdmaEcio >= -90) ecioAsuLevel = 16; 159 else if (cdmaEcio >= -100) ecioAsuLevel = 8; 160 else if (cdmaEcio >= -115) ecioAsuLevel = 4; 161 else if (cdmaEcio >= -130) ecioAsuLevel = 2; 162 else if (cdmaEcio >= -150) ecioAsuLevel = 1; 163 else ecioAsuLevel = 99; 164 165 int level = (cdmaAsuLevel < ecioAsuLevel) ? cdmaAsuLevel : ecioAsuLevel; 166 if (DBG) log("getAsuLevel=" + level); 167 return level; 168 } 169 170 /** 171 * Get cdma as level 0..4 172 */ getCdmaLevel()173 public int getCdmaLevel() { 174 final int cdmaDbm = getCdmaDbm(); 175 final int cdmaEcio = getCdmaEcio(); 176 int levelDbm; 177 int levelEcio; 178 179 if (cdmaDbm == Integer.MAX_VALUE) levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 180 else if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT; 181 else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD; 182 else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE; 183 else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR; 184 else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 185 186 // Ec/Io are in dB*10 187 if (cdmaEcio == Integer.MAX_VALUE) levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 188 else if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT; 189 else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD; 190 else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE; 191 else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR; 192 else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 193 194 int level = (levelDbm < levelEcio) ? levelDbm : levelEcio; 195 if (DBG) log("getCdmaLevel=" + level); 196 return level; 197 } 198 199 /** 200 * Get Evdo as level 0..4 201 */ getEvdoLevel()202 public int getEvdoLevel() { 203 int evdoDbm = getEvdoDbm(); 204 int evdoSnr = getEvdoSnr(); 205 int levelEvdoDbm; 206 int levelEvdoSnr; 207 208 if (evdoDbm == Integer.MAX_VALUE) levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 209 else if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT; 210 else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD; 211 else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE; 212 else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR; 213 else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 214 215 if (evdoSnr == Integer.MAX_VALUE) levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 216 else if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT; 217 else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD; 218 else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE; 219 else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR; 220 else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 221 222 int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr; 223 if (DBG) log("getEvdoLevel=" + level); 224 return level; 225 } 226 227 /** 228 * Get the signal strength as dBm 229 */ 230 @Override getDbm()231 public int getDbm() { 232 int cdmaDbm = getCdmaDbm(); 233 int evdoDbm = getEvdoDbm(); 234 235 // Use the lower value to be conservative 236 return (cdmaDbm < evdoDbm) ? cdmaDbm : evdoDbm; 237 } 238 239 /** 240 * Get the CDMA RSSI value in dBm 241 */ getCdmaDbm()242 public int getCdmaDbm() { 243 return mCdmaDbm; 244 } 245 /** @hide */ setCdmaDbm(int cdmaDbm)246 public void setCdmaDbm(int cdmaDbm) { 247 mCdmaDbm = cdmaDbm; 248 } 249 250 /** 251 * Get the CDMA Ec/Io value in dB*10 252 */ getCdmaEcio()253 public int getCdmaEcio() { 254 return mCdmaEcio; 255 } 256 /** @hide */ setCdmaEcio(int cdmaEcio)257 public void setCdmaEcio(int cdmaEcio) { 258 mCdmaEcio = cdmaEcio; 259 } 260 261 /** 262 * Get the EVDO RSSI value in dBm 263 */ getEvdoDbm()264 public int getEvdoDbm() { 265 return mEvdoDbm; 266 } 267 /** @hide */ setEvdoDbm(int evdoDbm)268 public void setEvdoDbm(int evdoDbm) { 269 mEvdoDbm = evdoDbm; 270 } 271 272 /** 273 * Get the EVDO Ec/Io value in dB*10 274 */ getEvdoEcio()275 public int getEvdoEcio() { 276 return mEvdoEcio; 277 } 278 /** @hide */ setEvdoEcio(int evdoEcio)279 public void setEvdoEcio(int evdoEcio) { 280 mEvdoEcio = evdoEcio; 281 } 282 283 /** 284 * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest. 285 */ getEvdoSnr()286 public int getEvdoSnr() { 287 return mEvdoSnr; 288 } 289 /** @hide */ setEvdoSnr(int evdoSnr)290 public void setEvdoSnr(int evdoSnr) { 291 mEvdoSnr = evdoSnr; 292 } 293 294 @Override hashCode()295 public int hashCode() { 296 int primeNum = 31; 297 return ((mCdmaDbm * primeNum) + (mCdmaEcio * primeNum) 298 + (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum)); 299 } 300 301 @Override equals(Object o)302 public boolean equals (Object o) { 303 CellSignalStrengthCdma s; 304 305 try { 306 s = (CellSignalStrengthCdma) o; 307 } catch (ClassCastException ex) { 308 return false; 309 } 310 311 if (o == null) { 312 return false; 313 } 314 315 return mCdmaDbm == s.mCdmaDbm 316 && mCdmaEcio == s.mCdmaEcio 317 && mEvdoDbm == s.mEvdoDbm 318 && mEvdoEcio == s.mEvdoEcio 319 && mEvdoSnr == s.mEvdoSnr; 320 } 321 322 /** 323 * @return string representation. 324 */ 325 @Override toString()326 public String toString() { 327 return "CellSignalStrengthCdma:" 328 + " cdmaDbm=" + mCdmaDbm 329 + " cdmaEcio=" + mCdmaEcio 330 + " evdoDbm=" + mEvdoDbm 331 + " evdoEcio=" + mEvdoEcio 332 + " evdoSnr=" + mEvdoSnr; 333 } 334 335 /** Implement the Parcelable interface */ 336 @Override writeToParcel(Parcel dest, int flags)337 public void writeToParcel(Parcel dest, int flags) { 338 if (DBG) log("writeToParcel(Parcel, int): " + toString()); 339 // Need to multiply CdmaDbm, CdmaEcio, EvdoDbm and EvdoEcio by -1 340 // to ensure consistency when reading values written here 341 // unless the value is invalid 342 dest.writeInt(mCdmaDbm * (mCdmaDbm != Integer.MAX_VALUE ? -1 : 1)); 343 dest.writeInt(mCdmaEcio * (mCdmaEcio != Integer.MAX_VALUE ? -1 : 1)); 344 dest.writeInt(mEvdoDbm * (mEvdoDbm != Integer.MAX_VALUE ? -1 : 1)); 345 dest.writeInt(mEvdoEcio * (mEvdoEcio != Integer.MAX_VALUE ? -1 : 1)); 346 dest.writeInt(mEvdoSnr); 347 } 348 349 /** 350 * Construct a SignalStrength object from the given parcel 351 * where the TYPE_CDMA token is already been processed. 352 */ CellSignalStrengthCdma(Parcel in)353 private CellSignalStrengthCdma(Parcel in) { 354 // CdmaDbm, CdmaEcio, EvdoDbm and EvdoEcio are written into 355 // the parcel as positive values. 356 // Need to convert into negative values unless the value is invalid 357 mCdmaDbm = in.readInt(); 358 if (mCdmaDbm != Integer.MAX_VALUE) mCdmaDbm *= -1; 359 mCdmaEcio = in.readInt(); 360 if (mCdmaEcio != Integer.MAX_VALUE) mCdmaEcio *= -1; 361 mEvdoDbm = in.readInt(); 362 if (mEvdoDbm != Integer.MAX_VALUE) mEvdoDbm *= -1; 363 mEvdoEcio = in.readInt(); 364 if (mEvdoEcio != Integer.MAX_VALUE) mEvdoEcio *= -1; 365 mEvdoSnr = in.readInt(); 366 if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString()); 367 } 368 369 /** Implement the Parcelable interface */ 370 @Override describeContents()371 public int describeContents() { 372 return 0; 373 } 374 375 /** Implement the Parcelable interface */ 376 @SuppressWarnings("hiding") 377 public static final Parcelable.Creator<CellSignalStrengthCdma> CREATOR = 378 new Parcelable.Creator<CellSignalStrengthCdma>() { 379 @Override 380 public CellSignalStrengthCdma createFromParcel(Parcel in) { 381 return new CellSignalStrengthCdma(in); 382 } 383 384 @Override 385 public CellSignalStrengthCdma[] newArray(int size) { 386 return new CellSignalStrengthCdma[size]; 387 } 388 }; 389 390 /** 391 * log 392 */ log(String s)393 private static void log(String s) { 394 Rlog.w(LOG_TAG, s); 395 } 396 } 397