From cb78dd2da23ccf170caa9acdf244c0724b04f27a Mon Sep 17 00:00:00 2001 From: John Wang Date: Mon, 30 Jan 2012 18:45:56 -0800 Subject: [PATCH] Use LTE SNR and RSRP to set signal level bar. The LTE signal strength level is the smaller one between lte rsrp level and lte snr level if both rsrp and snr are valid. The lte snr mapping are Four bars: SNR >= 45 Three bars: 10 <= SNR < 45 Two bars: -30 <= SNR < 10 One bars: SNR < -30 No bars: No Service The invalid value of lte snr is changed to INVALID_SNR from -1, since -1 is a valid value of lte snr. bug:5640958 Change-Id: If26aaba0c7fcc0fee3db488b5adfa02922f06715 --- .../android/telephony/SignalStrength.java | 34 +++++++++++++++---- .../cdma/CdmaLteServiceStateTracker.java | 24 +++++++++---- .../telephony/gsm/GsmServiceStateTracker.java | 6 ++-- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java index 05e198f3dbdbe..1a4b574ce5dcf 100644 --- a/telephony/java/android/telephony/SignalStrength.java +++ b/telephony/java/android/telephony/SignalStrength.java @@ -47,6 +47,9 @@ public class SignalStrength implements Parcelable { "none", "poor", "moderate", "good", "great" }; + /** @hide */ + public static final int INVALID_SNR = 0x7FFFFFFF; + private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 private int mGsmBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 private int mCdmaDbm; // This value is the RSSI value @@ -96,7 +99,7 @@ public class SignalStrength implements Parcelable { mLteSignalStrength = -1; mLteRsrp = -1; mLteRsrq = -1; - mLteRssnr = -1; + mLteRssnr = INVALID_SNR; mLteCqi = -1; isGsm = true; } @@ -136,7 +139,8 @@ public class SignalStrength implements Parcelable { int evdoDbm, int evdoEcio, int evdoSnr, boolean gsm) { this(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio, - evdoDbm, evdoEcio, evdoSnr, -1, -1, -1, -1, -1, gsm); + evdoDbm, evdoEcio, evdoSnr, -1, -1, + -1, INVALID_SNR, -1, gsm); } /** @@ -292,7 +296,7 @@ public class SignalStrength implements Parcelable { if ((mLteSignalStrength == -1) && (mLteRsrp == -1) && (mLteRsrq == -1) - && (mLteRssnr == -1) + && (mLteRssnr == INVALID_SNR) && (mLteCqi == -1)) { level = getGsmLevel(); } else { @@ -327,7 +331,7 @@ public class SignalStrength implements Parcelable { if ((mLteSignalStrength == -1) && (mLteRsrp == -1) && (mLteRsrq == -1) - && (mLteRssnr == -1) + && (mLteRssnr == INVALID_SNR) && (mLteCqi == -1)) { asuLevel = getGsmAsuLevel(); } else { @@ -363,7 +367,7 @@ public class SignalStrength implements Parcelable { if ((mLteSignalStrength == -1) && (mLteRsrp == -1) && (mLteRsrq == -1) - && (mLteRssnr == -1) + && (mLteRssnr == INVALID_SNR) && (mLteCqi == -1)) { dBm = getGsmDbm(); } else { @@ -566,6 +570,7 @@ public class SignalStrength implements Parcelable { */ public int getLteLevel() { int levelLteRsrp = 0; + int levelLteRssnr = 0; if (mLteRsrp == -1) levelLteRsrp = 0; else if (mLteRsrp >= -95) levelLteRsrp = SIGNAL_STRENGTH_GREAT; @@ -573,8 +578,23 @@ public class SignalStrength implements Parcelable { else if (mLteRsrp >= -115) levelLteRsrp = SIGNAL_STRENGTH_MODERATE; else levelLteRsrp = SIGNAL_STRENGTH_POOR; - if (DBG) log("Lte level: "+levelLteRsrp); - return levelLteRsrp; + if (mLteRssnr == INVALID_SNR) levelLteRssnr = 0; + else if (mLteRssnr >= 45) levelLteRssnr = SIGNAL_STRENGTH_GREAT; + else if (mLteRssnr >= 10) levelLteRssnr = SIGNAL_STRENGTH_GOOD; + else if (mLteRssnr >= -30) levelLteRssnr = SIGNAL_STRENGTH_MODERATE; + else levelLteRssnr = SIGNAL_STRENGTH_POOR; + + int level; + if (mLteRsrp == -1) + level = levelLteRssnr; + else if (mLteRssnr == INVALID_SNR) + level = levelLteRsrp; + else + level = (levelLteRssnr < levelLteRsrp) ? levelLteRssnr : levelLteRsrp; + + if (DBG) log("Lte rsrp level: "+levelLteRsrp + + " snr level: " + levelLteRssnr + " level: " + level); + return level; } /** diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java index 3486190f20294..610cd5d4f54bd 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java @@ -147,7 +147,9 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { @Override protected void setSignalStrengthDefaultValues() { - mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, false); + // TODO Make a constructor only has boolean gsm as parameter + mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, + -1, -1, -1, SignalStrength.INVALID_SNR, -1, false); } @Override @@ -452,8 +454,13 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { setSignalStrengthDefaultValues(); } else { int[] ints = (int[])ar.result; - int lteCqi = 99, lteRsrp = -1; - int lteRssi = 99; + + int lteRssi = -1; + int lteRsrp = -1; + int lteRsrq = -1; + int lteRssnr = SignalStrength.INVALID_SNR; + int lteCqi = -1; + int offset = 2; int cdmaDbm = (ints[offset] > 0) ? -ints[offset] : -120; int cdmaEcio = (ints[offset + 1] > 0) ? -ints[offset + 1] : -160; @@ -461,10 +468,13 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { int evdoEcio = (ints[offset + 3] > 0) ? -ints[offset + 3] : -1; int evdoSnr = ((ints[offset + 4] > 0) && (ints[offset + 4] <= 8)) ? ints[offset + 4] : -1; + if (networkType == ServiceState.RADIO_TECHNOLOGY_LTE) { - lteRssi = (ints[offset + 5] >= 0) ? ints[offset + 5] : 99; - lteRsrp = (ints[offset + 6] < 0) ? ints[offset + 6] : -1; - lteCqi = (ints[offset + 7] >= 0) ? ints[offset + 7] : 99; + lteRssi = ints[offset+5]; + lteRsrp = ints[offset+6]; + lteRsrq = ints[offset+7]; + lteRssnr = ints[offset+8]; + lteCqi = ints[offset+9]; } if (networkType != ServiceState.RADIO_TECHNOLOGY_LTE) { @@ -472,7 +482,7 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { evdoSnr, false); } else { mSignalStrength = new SignalStrength(99, -1, cdmaDbm, cdmaEcio, evdoRssi, evdoEcio, - evdoSnr, lteRssi, lteRsrp, -1, -1, lteCqi, true); + evdoSnr, lteRssi, lteRsrp, lteRsrq, lteRssnr, lteCqi, true); } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java index 84127cff8c630..6e2b262d22242 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java @@ -671,7 +671,9 @@ final class GsmServiceStateTracker extends ServiceStateTracker { } private void setSignalStrengthDefaultValues() { - mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, true); + // TODO Make a constructor only has boolean gsm as parameter + mSignalStrength = new SignalStrength(99, -1, -1, -1, -1, -1, -1, + -1, -1, -1, SignalStrength.INVALID_SNR, -1, true); } /** @@ -1023,7 +1025,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { int lteSignalStrength = -1; int lteRsrp = -1; int lteRsrq = -1; - int lteRssnr = -1; + int lteRssnr = SignalStrength.INVALID_SNR; int lteCqi = -1; if (ar.exception != null) {