SignalStrength.java revision 369808638bcdf90a2e4723cbd728aa29e2f4a051
14f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* 24f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Copyright (C) 2012 The Android Open Source Project 34f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 44f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 54f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * you may not use this file except in compliance with the License. 64f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * You may obtain a copy of the License at 74f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 84f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 94f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Unless required by applicable law or agreed to in writing, software 114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * See the License for the specific language governing permissions and 144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * limitations under the License. 154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberpackage android.telephony; 184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.os.Bundle; 204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.os.Parcel; 214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.os.Parcelable; 224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.telephony.Rlog; 234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.content.res.Resources; 244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/** 264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Contains phone signal strength related information. 274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberpublic class SignalStrength implements Parcelable { 294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private static final String LOG_TAG = "SignalStrength"; 314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private static final boolean DBG = false; 324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0; 354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int SIGNAL_STRENGTH_POOR = 1; 374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int SIGNAL_STRENGTH_MODERATE = 2; 394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int SIGNAL_STRENGTH_GOOD = 3; 414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int SIGNAL_STRENGTH_GREAT = 4; 434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int NUM_SIGNAL_STRENGTH_BINS = 5; 454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final String[] SIGNAL_STRENGTH_NAMES = { 474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber "none", "poor", "moderate", "good", "great" 484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber }; 494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** @hide */ 514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber //Use int max, as -1 is a valid value in signal strength 524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static final int INVALID = 0x7FFFFFFF; 534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private static final int RSRP_THRESH_TYPE_STRICT = 0; 554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private static final int[] RSRP_THRESH_STRICT = new int[] {-140, -115, -105, -95, -85, -44}; 564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private static final int[] RSRP_THRESH_LENIENT = new int[] {-140, -128, -118, -108, -98, -44}; 574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mGsmBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mCdmaDbm; // This value is the RSSI value 624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mCdmaEcio; // This value is the Ec/Io 634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mEvdoDbm; // This value is the EVDO RSSI value 644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mEvdoEcio; // This value is the EVDO Ec/Io 654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mEvdoSnr; // Valid values are 0-8. 8 is the highest signal to noise ratio 664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mLteSignalStrength; 674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mLteRsrp; 684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mLteRsrq; 694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mLteRssnr; 704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mLteCqi; 714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private int mTdScdmaRscp; 724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber private boolean isGsm; // This value is set by the ServiceStateTracker onSignalStrengthResult 744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Create a new SignalStrength from a intent notifier Bundle 774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * This method is used by PhoneStateIntentReceiver and maybe by 794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * external applications. 804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param m Bundle from intent notifier 824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @return newly created SignalStrength 834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static SignalStrength newFromBundle(Bundle m) { 874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber SignalStrength ret; 884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ret = new SignalStrength(); 894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ret.setFromNotifierBundle(m); 904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return ret; 914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Empty constructor 954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength() { 994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmSignalStrength = 99; 1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmBitErrorRate = -1; 1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaDbm = -1; 1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaEcio = -1; 1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoDbm = -1; 1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoEcio = -1; 1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoSnr = -1; 1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteSignalStrength = 99; 1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrp = INVALID; 1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrq = INVALID; 1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRssnr = INVALID; 1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteCqi = INVALID; 1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mTdScdmaRscp = INVALID; 1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isGsm = true; 1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * This constructor is used to create SignalStrength with default 1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * values and set the isGsmFlag with the value passed in the input 1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsmFlag true if Gsm Phone,false if Cdma phone 1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @return newly created SignalStrength 1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength(boolean gsmFlag) { 1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmSignalStrength = 99; 1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmBitErrorRate = -1; 1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaDbm = -1; 1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaEcio = -1; 1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoDbm = -1; 1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoEcio = -1; 1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoSnr = -1; 1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteSignalStrength = 99; 1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrp = INVALID; 1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrq = INVALID; 1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRssnr = INVALID; 1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteCqi = INVALID; 1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mTdScdmaRscp = INVALID; 1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isGsm = gsmFlag; 1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Constructor 1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate, 1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int cdmaDbm, int cdmaEcio, 1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int evdoDbm, int evdoEcio, int evdoSnr, 1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi, 1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int tdScdmaRscp, boolean gsmFlag) { 1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio, 1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp, 1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lteRsrq, lteRssnr, lteCqi, gsmFlag); 1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mTdScdmaRscp = tdScdmaRscp; 1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Constructor 1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate, 1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int cdmaDbm, int cdmaEcio, 1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int evdoDbm, int evdoEcio, int evdoSnr, 1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi, 1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber boolean gsmFlag) { 1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio, 1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp, 1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lteRsrq, lteRssnr, lteCqi, gsmFlag); 1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Constructor 1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate, 1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int cdmaDbm, int cdmaEcio, 1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int evdoDbm, int evdoEcio, int evdoSnr, 1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber boolean gsmFlag) { 1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio, 1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evdoDbm, evdoEcio, evdoSnr, 99, INVALID, 1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INVALID, INVALID, INVALID, gsmFlag); 1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Copy constructors 1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param s Source SignalStrength 1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength(SignalStrength s) { 1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber copyFrom(s); 1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Initialize gsm/cdma values, sets lte values to defaults. 1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsmSignalStrength 2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsmBitErrorRate 2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param cdmaDbm 2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param cdmaEcio 2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param evdoDbm 2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param evdoEcio 2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param evdoSnr 2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsm 2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public void initialize(int gsmSignalStrength, int gsmBitErrorRate, 2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int cdmaDbm, int cdmaEcio, 2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int evdoDbm, int evdoEcio, int evdoSnr, 2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber boolean gsm) { 2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio, 2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evdoDbm, evdoEcio, evdoSnr, 99, INVALID, 2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INVALID, INVALID, INVALID, gsm); 2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Initialize all the values 2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsmSignalStrength 2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsmBitErrorRate 2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param cdmaDbm 2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param cdmaEcio 2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param evdoDbm 2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param evdoEcio 2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param evdoSnr 2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param lteSignalStrength 2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param lteRsrp 2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param lteRsrq 2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param lteRssnr 2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param lteCqi 2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @param gsm 2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public void initialize(int gsmSignalStrength, int gsmBitErrorRate, 2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int cdmaDbm, int cdmaEcio, 2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int evdoDbm, int evdoEcio, int evdoSnr, 2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi, 2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber boolean gsm) { 243f27422a71112e77af77de0da2e60d4deb94a9375Martin Storsjo mGsmSignalStrength = gsmSignalStrength; 2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmBitErrorRate = gsmBitErrorRate; 2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaDbm = cdmaDbm; 2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaEcio = cdmaEcio; 247f27422a71112e77af77de0da2e60d4deb94a9375Martin Storsjo mEvdoDbm = evdoDbm; 2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoEcio = evdoEcio; 2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoSnr = evdoSnr; 2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteSignalStrength = lteSignalStrength; 2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrp = lteRsrp; 2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrq = lteRsrq; 2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRssnr = lteRssnr; 2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteCqi = lteCqi; 2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mTdScdmaRscp = INVALID; 2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isGsm = gsm; 2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (DBG) log("initialize: " + toString()); 2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber protected void copyFrom(SignalStrength s) { 2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmSignalStrength = s.mGsmSignalStrength; 2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmBitErrorRate = s.mGsmBitErrorRate; 2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaDbm = s.mCdmaDbm; 2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaEcio = s.mCdmaEcio; 2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoDbm = s.mEvdoDbm; 2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoEcio = s.mEvdoEcio; 2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoSnr = s.mEvdoSnr; 2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteSignalStrength = s.mLteSignalStrength; 2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrp = s.mLteRsrp; 2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrq = s.mLteRsrq; 2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRssnr = s.mLteRssnr; 2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteCqi = s.mLteCqi; 2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mTdScdmaRscp = s.mTdScdmaRscp; 2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isGsm = s.isGsm; 2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Construct a SignalStrength object from the given parcel. 2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public SignalStrength(Parcel in) { 2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (DBG) log("Size of signalstrength parcel:" + in.dataSize()); 2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmSignalStrength = in.readInt(); 2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mGsmBitErrorRate = in.readInt(); 2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaDbm = in.readInt(); 2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mCdmaEcio = in.readInt(); 2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoDbm = in.readInt(); 2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoEcio = in.readInt(); 2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mEvdoSnr = in.readInt(); 2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteSignalStrength = in.readInt(); 2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrp = in.readInt(); 2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRsrq = in.readInt(); 2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteRssnr = in.readInt(); 2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mLteCqi = in.readInt(); 3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mTdScdmaRscp = in.readInt(); 3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isGsm = (in.readInt() != 0); 3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Make a SignalStrength object from the given parcel as passed up by 3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * the ril which does not have isGsm. isGsm will be changed by ServiceStateTracker 3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * so the default is a don't care. 3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * 3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * @hide 3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public static SignalStrength makeSignalStrengthFromRilParcel(Parcel in) { 3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (DBG) log("Size of signalstrength parcel:" + in.dataSize()); 3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber SignalStrength ss = new SignalStrength(); 3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mGsmSignalStrength = in.readInt(); 3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mGsmBitErrorRate = in.readInt(); 3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mCdmaDbm = in.readInt(); 3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mCdmaEcio = in.readInt(); 3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mEvdoDbm = in.readInt(); 3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mEvdoEcio = in.readInt(); 3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mEvdoSnr = in.readInt(); 3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mLteSignalStrength = in.readInt(); 3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mLteRsrp = in.readInt(); 3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mLteRsrq = in.readInt(); 3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mLteRssnr = in.readInt(); 3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mLteCqi = in.readInt(); 3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ss.mTdScdmaRscp = in.readInt(); 3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return ss; 3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /** 3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * {@link Parcelable#writeToParcel} 3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber public void writeToParcel(Parcel out, int flags) { 3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mGsmSignalStrength); 3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mGsmBitErrorRate); 3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mCdmaDbm); 3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mCdmaEcio); 3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mEvdoDbm); 340ffa34edd0fd50d558f9bc7a650d959b4d3d29123Martin Storsjo out.writeInt(mEvdoEcio); 3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mEvdoSnr); 3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber out.writeInt(mLteSignalStrength); 343 out.writeInt(mLteRsrp); 344 out.writeInt(mLteRsrq); 345 out.writeInt(mLteRssnr); 346 out.writeInt(mLteCqi); 347 out.writeInt(mTdScdmaRscp); 348 out.writeInt(isGsm ? 1 : 0); 349 } 350 351 /** 352 * {@link Parcelable#describeContents} 353 */ 354 public int describeContents() { 355 return 0; 356 } 357 358 /** 359 * {@link Parcelable.Creator} 360 * 361 * @hide 362 */ 363 public static final Parcelable.Creator<SignalStrength> CREATOR = new Parcelable.Creator() { 364 public SignalStrength createFromParcel(Parcel in) { 365 return new SignalStrength(in); 366 } 367 368 public SignalStrength[] newArray(int size) { 369 return new SignalStrength[size]; 370 } 371 }; 372 373 /** 374 * Validate the individual signal strength fields as per the range 375 * specified in ril.h 376 * Set to invalid any field that is not in the valid range 377 * Cdma, evdo, lte rsrp & rsrq values are sign converted 378 * when received from ril interface 379 * 380 * @return 381 * Valid values for all signalstrength fields 382 * @hide 383 */ 384 public void validateInput() { 385 if (DBG) log("Signal before validate=" + this); 386 // TS 27.007 8.5 387 mGsmSignalStrength = mGsmSignalStrength >= 0 ? mGsmSignalStrength : 99; 388 // BER no change; 389 390 mCdmaDbm = mCdmaDbm > 0 ? -mCdmaDbm : -120; 391 mCdmaEcio = (mCdmaEcio > 0) ? -mCdmaEcio : -160; 392 393 mEvdoDbm = (mEvdoDbm > 0) ? -mEvdoDbm : -120; 394 mEvdoEcio = (mEvdoEcio >= 0) ? -mEvdoEcio : -1; 395 mEvdoSnr = ((mEvdoSnr > 0) && (mEvdoSnr <= 8)) ? mEvdoSnr : -1; 396 397 // TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC 398 mLteSignalStrength = (mLteSignalStrength >= 0) ? mLteSignalStrength : 99; 399 mLteRsrp = ((mLteRsrp >= 44) && (mLteRsrp <= 140)) ? -mLteRsrp : SignalStrength.INVALID; 400 mLteRsrq = ((mLteRsrq >= 3) && (mLteRsrq <= 20)) ? -mLteRsrq : SignalStrength.INVALID; 401 mLteRssnr = ((mLteRssnr >= -200) && (mLteRssnr <= 300)) ? mLteRssnr 402 : SignalStrength.INVALID; 403 404 mTdScdmaRscp = ((mTdScdmaRscp >= 25) && (mTdScdmaRscp <= 120)) 405 ? -mTdScdmaRscp : SignalStrength.INVALID; 406 // Cqi no change 407 if (DBG) log("Signal after validate=" + this); 408 } 409 410 /** 411 * @param true - Gsm, Lte phones 412 * false - Cdma phones 413 * 414 * Used by voice phone to set the isGsm 415 * flag 416 * @hide 417 */ 418 public void setGsm(boolean gsmFlag) { 419 isGsm = gsmFlag; 420 } 421 422 /** 423 * Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS 424 * 27.007 8.5 425 */ 426 public int getGsmSignalStrength() { 427 return this.mGsmSignalStrength; 428 } 429 430 /** 431 * Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5 432 */ 433 public int getGsmBitErrorRate() { 434 return this.mGsmBitErrorRate; 435 } 436 437 /** 438 * Get the CDMA RSSI value in dBm 439 */ 440 public int getCdmaDbm() { 441 return this.mCdmaDbm; 442 } 443 444 /** 445 * Get the CDMA Ec/Io value in dB*10 446 */ 447 public int getCdmaEcio() { 448 return this.mCdmaEcio; 449 } 450 451 /** 452 * Get the EVDO RSSI value in dBm 453 */ 454 public int getEvdoDbm() { 455 return this.mEvdoDbm; 456 } 457 458 /** 459 * Get the EVDO Ec/Io value in dB*10 460 */ 461 public int getEvdoEcio() { 462 return this.mEvdoEcio; 463 } 464 465 /** 466 * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest. 467 */ 468 public int getEvdoSnr() { 469 return this.mEvdoSnr; 470 } 471 472 /** @hide */ 473 public int getLteSignalStrength() { 474 return mLteSignalStrength; 475 } 476 477 /** @hide */ 478 public int getLteRsrp() { 479 return mLteRsrp; 480 } 481 482 /** @hide */ 483 public int getLteRsrq() { 484 return mLteRsrq; 485 } 486 487 /** @hide */ 488 public int getLteRssnr() { 489 return mLteRssnr; 490 } 491 492 /** @hide */ 493 public int getLteCqi() { 494 return mLteCqi; 495 } 496 497 /** 498 * Retrieve an abstract level value for the overall signal strength. 499 * 500 * @return a single integer from 0 to 4 representing the general signal quality. 501 * This may take into account many different radio technology inputs. 502 * 0 represents very poor signal strength 503 * while 4 represents a very strong signal strength. 504 */ 505 public int getLevel() { 506 int level = 0; 507 508 if (isGsm) { 509 level = getLteLevel(); 510 if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 511 level = getTdScdmaLevel(); 512 if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 513 level = getGsmLevel(); 514 } 515 } 516 } else { 517 int cdmaLevel = getCdmaLevel(); 518 int evdoLevel = getEvdoLevel(); 519 if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 520 /* We don't know evdo, use cdma */ 521 level = cdmaLevel; 522 } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 523 /* We don't know cdma, use evdo */ 524 level = evdoLevel; 525 } else { 526 /* We know both, use the lowest level */ 527 level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel; 528 } 529 } 530 if (DBG) log("getLevel=" + level); 531 return level; 532 } 533 534 /** 535 * Get the signal level as an asu value between 0..31, 99 is unknown 536 * 537 * @hide 538 */ 539 public int getAsuLevel() { 540 int asuLevel = 0; 541 if (isGsm) { 542 if (getLteLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 543 if (getTdScdmaLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 544 asuLevel = getGsmAsuLevel(); 545 } else { 546 asuLevel = getTdScdmaAsuLevel(); 547 } 548 } else { 549 asuLevel = getLteAsuLevel(); 550 } 551 } else { 552 int cdmaAsuLevel = getCdmaAsuLevel(); 553 int evdoAsuLevel = getEvdoAsuLevel(); 554 if (evdoAsuLevel == 0) { 555 /* We don't know evdo use, cdma */ 556 asuLevel = cdmaAsuLevel; 557 } else if (cdmaAsuLevel == 0) { 558 /* We don't know cdma use, evdo */ 559 asuLevel = evdoAsuLevel; 560 } else { 561 /* We know both, use the lowest level */ 562 asuLevel = cdmaAsuLevel < evdoAsuLevel ? cdmaAsuLevel : evdoAsuLevel; 563 } 564 } 565 if (DBG) log("getAsuLevel=" + asuLevel); 566 return asuLevel; 567 } 568 569 /** 570 * Get the signal strength as dBm 571 * 572 * @hide 573 */ 574 public int getDbm() { 575 int dBm = INVALID; 576 577 if(isGsm()) { 578 dBm = getLteDbm(); 579 if (dBm == INVALID) { 580 if (getTdScdmaLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 581 dBm = getGsmDbm(); 582 } else { 583 dBm = getTdScdmaDbm(); 584 } 585 } 586 } else { 587 int cdmaDbm = getCdmaDbm(); 588 int evdoDbm = getEvdoDbm(); 589 590 return (evdoDbm == -120) ? cdmaDbm : ((cdmaDbm == -120) ? evdoDbm 591 : (cdmaDbm < evdoDbm ? cdmaDbm : evdoDbm)); 592 } 593 if (DBG) log("getDbm=" + dBm); 594 return dBm; 595 } 596 597 /** 598 * Get Gsm signal strength as dBm 599 * 600 * @hide 601 */ 602 public int getGsmDbm() { 603 int dBm; 604 605 int gsmSignalStrength = getGsmSignalStrength(); 606 int asu = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength); 607 if (asu != -1) { 608 dBm = -113 + (2 * asu); 609 } else { 610 dBm = -1; 611 } 612 if (DBG) log("getGsmDbm=" + dBm); 613 return dBm; 614 } 615 616 /** 617 * Get gsm as level 0..4 618 * 619 * @hide 620 */ 621 public int getGsmLevel() { 622 int level; 623 624 // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 625 // asu = 0 (-113dB or less) is very weak 626 // signal, its better to show 0 bars to the user in such cases. 627 // asu = 99 is a special case, where the signal strength is unknown. 628 int asu = getGsmSignalStrength(); 629 if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 630 else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT; 631 else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD; 632 else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE; 633 else level = SIGNAL_STRENGTH_POOR; 634 if (DBG) log("getGsmLevel=" + level); 635 return level; 636 } 637 638 /** 639 * Get the gsm signal level as an asu value between 0..31, 99 is unknown 640 * 641 * @hide 642 */ 643 public int getGsmAsuLevel() { 644 // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 645 // asu = 0 (-113dB or less) is very weak 646 // signal, its better to show 0 bars to the user in such cases. 647 // asu = 99 is a special case, where the signal strength is unknown. 648 int level = getGsmSignalStrength(); 649 if (DBG) log("getGsmAsuLevel=" + level); 650 return level; 651 } 652 653 /** 654 * Get cdma as level 0..4 655 * 656 * @hide 657 */ 658 public int getCdmaLevel() { 659 final int cdmaDbm = getCdmaDbm(); 660 final int cdmaEcio = getCdmaEcio(); 661 int levelDbm; 662 int levelEcio; 663 664 if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT; 665 else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD; 666 else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE; 667 else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR; 668 else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 669 670 // Ec/Io are in dB*10 671 if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT; 672 else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD; 673 else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE; 674 else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR; 675 else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 676 677 int level = (levelDbm < levelEcio) ? levelDbm : levelEcio; 678 if (DBG) log("getCdmaLevel=" + level); 679 return level; 680 } 681 682 /** 683 * Get the cdma signal level as an asu value between 0..31, 99 is unknown 684 * 685 * @hide 686 */ 687 public int getCdmaAsuLevel() { 688 final int cdmaDbm = getCdmaDbm(); 689 final int cdmaEcio = getCdmaEcio(); 690 int cdmaAsuLevel; 691 int ecioAsuLevel; 692 693 if (cdmaDbm >= -75) cdmaAsuLevel = 16; 694 else if (cdmaDbm >= -82) cdmaAsuLevel = 8; 695 else if (cdmaDbm >= -90) cdmaAsuLevel = 4; 696 else if (cdmaDbm >= -95) cdmaAsuLevel = 2; 697 else if (cdmaDbm >= -100) cdmaAsuLevel = 1; 698 else cdmaAsuLevel = 99; 699 700 // Ec/Io are in dB*10 701 if (cdmaEcio >= -90) ecioAsuLevel = 16; 702 else if (cdmaEcio >= -100) ecioAsuLevel = 8; 703 else if (cdmaEcio >= -115) ecioAsuLevel = 4; 704 else if (cdmaEcio >= -130) ecioAsuLevel = 2; 705 else if (cdmaEcio >= -150) ecioAsuLevel = 1; 706 else ecioAsuLevel = 99; 707 708 int level = (cdmaAsuLevel < ecioAsuLevel) ? cdmaAsuLevel : ecioAsuLevel; 709 if (DBG) log("getCdmaAsuLevel=" + level); 710 return level; 711 } 712 713 /** 714 * Get Evdo as level 0..4 715 * 716 * @hide 717 */ 718 public int getEvdoLevel() { 719 int evdoDbm = getEvdoDbm(); 720 int evdoSnr = getEvdoSnr(); 721 int levelEvdoDbm; 722 int levelEvdoSnr; 723 724 if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT; 725 else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD; 726 else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE; 727 else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR; 728 else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 729 730 if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT; 731 else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD; 732 else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE; 733 else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR; 734 else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 735 736 int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr; 737 if (DBG) log("getEvdoLevel=" + level); 738 return level; 739 } 740 741 /** 742 * Get the evdo signal level as an asu value between 0..31, 99 is unknown 743 * 744 * @hide 745 */ 746 public int getEvdoAsuLevel() { 747 int evdoDbm = getEvdoDbm(); 748 int evdoSnr = getEvdoSnr(); 749 int levelEvdoDbm; 750 int levelEvdoSnr; 751 752 if (evdoDbm >= -65) levelEvdoDbm = 16; 753 else if (evdoDbm >= -75) levelEvdoDbm = 8; 754 else if (evdoDbm >= -85) levelEvdoDbm = 4; 755 else if (evdoDbm >= -95) levelEvdoDbm = 2; 756 else if (evdoDbm >= -105) levelEvdoDbm = 1; 757 else levelEvdoDbm = 99; 758 759 if (evdoSnr >= 7) levelEvdoSnr = 16; 760 else if (evdoSnr >= 6) levelEvdoSnr = 8; 761 else if (evdoSnr >= 5) levelEvdoSnr = 4; 762 else if (evdoSnr >= 3) levelEvdoSnr = 2; 763 else if (evdoSnr >= 1) levelEvdoSnr = 1; 764 else levelEvdoSnr = 99; 765 766 int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr; 767 if (DBG) log("getEvdoAsuLevel=" + level); 768 return level; 769 } 770 771 /** 772 * Get LTE as dBm 773 * 774 * @hide 775 */ 776 public int getLteDbm() { 777 return mLteRsrp; 778 } 779 780 /** 781 * Get LTE as level 0..4 782 * 783 * @hide 784 */ 785 public int getLteLevel() { 786 /* 787 * TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received 788 * signal + noise RSRP = reference signal dBm RSRQ = quality of signal 789 * dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio 790 * = -10log P1/P2 dB 791 */ 792 int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN, rsrpIconLevel = -1, snrIconLevel = -1; 793 794 int rsrpThreshType = Resources.getSystem().getInteger(com.android.internal.R.integer. 795 config_LTE_RSRP_threshold_type); 796 int[] threshRsrp; 797 if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) { 798 threshRsrp = RSRP_THRESH_STRICT; 799 } else { 800 threshRsrp = RSRP_THRESH_LENIENT; 801 } 802 803 if (mLteRsrp > threshRsrp[5]) rsrpIconLevel = -1; 804 else if (mLteRsrp >= threshRsrp[4]) rsrpIconLevel = SIGNAL_STRENGTH_GREAT; 805 else if (mLteRsrp >= threshRsrp[3]) rsrpIconLevel = SIGNAL_STRENGTH_GOOD; 806 else if (mLteRsrp >= threshRsrp[2]) rsrpIconLevel = SIGNAL_STRENGTH_MODERATE; 807 else if (mLteRsrp >= threshRsrp[1]) rsrpIconLevel = SIGNAL_STRENGTH_POOR; 808 else if (mLteRsrp >= threshRsrp[0]) rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 809 810 /* 811 * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5 812 * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars 813 * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna 814 * Icon Only 815 */ 816 if (mLteRssnr > 300) snrIconLevel = -1; 817 else if (mLteRssnr >= 130) snrIconLevel = SIGNAL_STRENGTH_GREAT; 818 else if (mLteRssnr >= 45) snrIconLevel = SIGNAL_STRENGTH_GOOD; 819 else if (mLteRssnr >= 10) snrIconLevel = SIGNAL_STRENGTH_MODERATE; 820 else if (mLteRssnr >= -30) snrIconLevel = SIGNAL_STRENGTH_POOR; 821 else if (mLteRssnr >= -200) 822 snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 823 824 if (DBG) log("getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:" 825 + rsrpIconLevel + " snrIconLevel:" + snrIconLevel); 826 827 /* Choose a measurement type to use for notification */ 828 if (snrIconLevel != -1 && rsrpIconLevel != -1) { 829 /* 830 * The number of bars displayed shall be the smaller of the bars 831 * associated with LTE RSRP and the bars associated with the LTE 832 * RS_SNR 833 */ 834 return (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel); 835 } 836 837 if (snrIconLevel != -1) return snrIconLevel; 838 839 if (rsrpIconLevel != -1) return rsrpIconLevel; 840 841 /* Valid values are (0-63, 99) as defined in TS 36.331 */ 842 if (mLteSignalStrength > 63) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 843 else if (mLteSignalStrength >= 12) rssiIconLevel = SIGNAL_STRENGTH_GREAT; 844 else if (mLteSignalStrength >= 8) rssiIconLevel = SIGNAL_STRENGTH_GOOD; 845 else if (mLteSignalStrength >= 5) rssiIconLevel = SIGNAL_STRENGTH_MODERATE; 846 else if (mLteSignalStrength >= 0) rssiIconLevel = SIGNAL_STRENGTH_POOR; 847 848 if (DBG) log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:" 849 + rssiIconLevel); 850 return rssiIconLevel; 851 852 } 853 /** 854 * Get the LTE signal level as an asu value between 0..97, 99 is unknown 855 * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 856 * 857 * @hide 858 */ 859 public int getLteAsuLevel() { 860 int lteAsuLevel = 99; 861 int lteDbm = getLteDbm(); 862 /* 863 * 3GPP 27.007 (Ver 10.3.0) Sec 8.69 864 * 0 -140 dBm or less 865 * 1 -139 dBm 866 * 2...96 -138... -44 dBm 867 * 97 -43 dBm or greater 868 * 255 not known or not detectable 869 */ 870 /* 871 * validateInput will always give a valid range between -140 t0 -44 as 872 * per ril.h. so RSRP >= -43 & <-140 will fall under asu level 255 873 * and not 97 or 0 874 */ 875 if (lteDbm == SignalStrength.INVALID) lteAsuLevel = 255; 876 else lteAsuLevel = lteDbm + 140; 877 if (DBG) log("Lte Asu level: "+lteAsuLevel); 878 return lteAsuLevel; 879 } 880 881 /** 882 * @return true if this is for GSM 883 */ 884 public boolean isGsm() { 885 return this.isGsm; 886 } 887 888 /** 889 * @return get TD_SCDMA dbm 890 * 891 * @hide 892 */ 893 public int getTdScdmaDbm() { 894 return this.mTdScdmaRscp; 895 } 896 897 /** 898 * Get TD-SCDMA as level 0..4 899 * Range : 25 to 120 900 * INT_MAX: 0x7FFFFFFF denotes invalid value 901 * Reference: 3GPP TS 25.123, section 9.1.1.1 902 * 903 * @hide 904 */ 905 public int getTdScdmaLevel() { 906 final int tdScdmaDbm = getTdScdmaDbm(); 907 int level; 908 909 if ((tdScdmaDbm > -25) || (tdScdmaDbm == SignalStrength.INVALID)) 910 level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 911 else if (tdScdmaDbm >= -49) level = SIGNAL_STRENGTH_GREAT; 912 else if (tdScdmaDbm >= -73) level = SIGNAL_STRENGTH_GOOD; 913 else if (tdScdmaDbm >= -97) level = SIGNAL_STRENGTH_MODERATE; 914 else if (tdScdmaDbm >= -120) level = SIGNAL_STRENGTH_POOR; 915 else level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 916 917 if (DBG) log("getTdScdmaLevel = " + level); 918 return level; 919 } 920 921 /** 922 * Get the TD-SCDMA signal level as an asu value. 923 * 924 * @hide 925 */ 926 public int getTdScdmaAsuLevel() { 927 final int tdScdmaDbm = getTdScdmaDbm(); 928 int tdScdmaAsuLevel; 929 930 if (tdScdmaDbm == INVALID) tdScdmaAsuLevel = 255; 931 else tdScdmaAsuLevel = tdScdmaDbm + 120; 932 if (DBG) log("TD-SCDMA Asu level: " + tdScdmaAsuLevel); 933 return tdScdmaAsuLevel; 934 } 935 936 /** 937 * @return hash code 938 */ 939 @Override 940 public int hashCode() { 941 int primeNum = 31; 942 return ((mGsmSignalStrength * primeNum) 943 + (mGsmBitErrorRate * primeNum) 944 + (mCdmaDbm * primeNum) + (mCdmaEcio * primeNum) 945 + (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum) 946 + (mLteSignalStrength * primeNum) + (mLteRsrp * primeNum) 947 + (mLteRsrq * primeNum) + (mLteRssnr * primeNum) + (mLteCqi * primeNum) 948 + (mTdScdmaRscp * primeNum) + (isGsm ? 1 : 0)); 949 } 950 951 /** 952 * @return true if the signal strengths are the same 953 */ 954 @Override 955 public boolean equals (Object o) { 956 SignalStrength s; 957 958 try { 959 s = (SignalStrength) o; 960 } catch (ClassCastException ex) { 961 return false; 962 } 963 964 if (o == null) { 965 return false; 966 } 967 968 return (mGsmSignalStrength == s.mGsmSignalStrength 969 && mGsmBitErrorRate == s.mGsmBitErrorRate 970 && mCdmaDbm == s.mCdmaDbm 971 && mCdmaEcio == s.mCdmaEcio 972 && mEvdoDbm == s.mEvdoDbm 973 && mEvdoEcio == s.mEvdoEcio 974 && mEvdoSnr == s.mEvdoSnr 975 && mLteSignalStrength == s.mLteSignalStrength 976 && mLteRsrp == s.mLteRsrp 977 && mLteRsrq == s.mLteRsrq 978 && mLteRssnr == s.mLteRssnr 979 && mLteCqi == s.mLteCqi 980 && mTdScdmaRscp == s.mTdScdmaRscp 981 && isGsm == s.isGsm); 982 } 983 984 /** 985 * @return string representation. 986 */ 987 @Override 988 public String toString() { 989 return ("SignalStrength:" 990 + " " + mGsmSignalStrength 991 + " " + mGsmBitErrorRate 992 + " " + mCdmaDbm 993 + " " + mCdmaEcio 994 + " " + mEvdoDbm 995 + " " + mEvdoEcio 996 + " " + mEvdoSnr 997 + " " + mLteSignalStrength 998 + " " + mLteRsrp 999 + " " + mLteRsrq 1000 + " " + mLteRssnr 1001 + " " + mLteCqi 1002 + " " + mTdScdmaRscp 1003 + " " + (isGsm ? "gsm|lte" : "cdma")); 1004 } 1005 1006 /** 1007 * Set SignalStrength based on intent notifier map 1008 * 1009 * @param m intent notifier map 1010 * @hide 1011 */ 1012 private void setFromNotifierBundle(Bundle m) { 1013 mGsmSignalStrength = m.getInt("GsmSignalStrength"); 1014 mGsmBitErrorRate = m.getInt("GsmBitErrorRate"); 1015 mCdmaDbm = m.getInt("CdmaDbm"); 1016 mCdmaEcio = m.getInt("CdmaEcio"); 1017 mEvdoDbm = m.getInt("EvdoDbm"); 1018 mEvdoEcio = m.getInt("EvdoEcio"); 1019 mEvdoSnr = m.getInt("EvdoSnr"); 1020 mLteSignalStrength = m.getInt("LteSignalStrength"); 1021 mLteRsrp = m.getInt("LteRsrp"); 1022 mLteRsrq = m.getInt("LteRsrq"); 1023 mLteRssnr = m.getInt("LteRssnr"); 1024 mLteCqi = m.getInt("LteCqi"); 1025 mTdScdmaRscp = m.getInt("TdScdma"); 1026 isGsm = m.getBoolean("isGsm"); 1027 } 1028 1029 /** 1030 * Set intent notifier Bundle based on SignalStrength 1031 * 1032 * @param m intent notifier Bundle 1033 * @hide 1034 */ 1035 public void fillInNotifierBundle(Bundle m) { 1036 m.putInt("GsmSignalStrength", mGsmSignalStrength); 1037 m.putInt("GsmBitErrorRate", mGsmBitErrorRate); 1038 m.putInt("CdmaDbm", mCdmaDbm); 1039 m.putInt("CdmaEcio", mCdmaEcio); 1040 m.putInt("EvdoDbm", mEvdoDbm); 1041 m.putInt("EvdoEcio", mEvdoEcio); 1042 m.putInt("EvdoSnr", mEvdoSnr); 1043 m.putInt("LteSignalStrength", mLteSignalStrength); 1044 m.putInt("LteRsrp", mLteRsrp); 1045 m.putInt("LteRsrq", mLteRsrq); 1046 m.putInt("LteRssnr", mLteRssnr); 1047 m.putInt("LteCqi", mLteCqi); 1048 m.putInt("TdScdma", mTdScdmaRscp); 1049 m.putBoolean("isGsm", Boolean.valueOf(isGsm)); 1050 } 1051 1052 /** 1053 * log 1054 */ 1055 private static void log(String s) { 1056 Rlog.w(LOG_TAG, s); 1057 } 1058} 1059