Home | History | Annotate | Download | only in telephony
      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  * LTE signal strength related information.
     25  */
     26 public final 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      * Initialize from the SignalStrength structure.
     91      *
     92      * @param ss
     93      *
     94      * @hide
     95      */
     96     public void initialize(SignalStrength ss, int timingAdvance) {
     97         mSignalStrength = ss.getLteSignalStrength();
     98         mRsrp = ss.getLteRsrp();
     99         mRsrq = ss.getLteRsrq();
    100         mRssnr = ss.getLteRssnr();
    101         mCqi = ss.getLteCqi();
    102         mTimingAdvance = timingAdvance;
    103     }
    104 
    105     /**
    106      * @hide
    107      */
    108     protected void copyFrom(CellSignalStrengthLte s) {
    109         mSignalStrength = s.mSignalStrength;
    110         mRsrp = s.mRsrp;
    111         mRsrq = s.mRsrq;
    112         mRssnr = s.mRssnr;
    113         mCqi = s.mCqi;
    114         mTimingAdvance = s.mTimingAdvance;
    115     }
    116 
    117     /**
    118      * @hide
    119      */
    120     @Override
    121     public CellSignalStrengthLte copy() {
    122         return new CellSignalStrengthLte(this);
    123     }
    124 
    125     /** @hide */
    126     @Override
    127     public void setDefaultValues() {
    128         mSignalStrength = Integer.MAX_VALUE;
    129         mRsrp = Integer.MAX_VALUE;
    130         mRsrq = Integer.MAX_VALUE;
    131         mRssnr = Integer.MAX_VALUE;
    132         mCqi = Integer.MAX_VALUE;
    133         mTimingAdvance = Integer.MAX_VALUE;
    134     }
    135 
    136     /**
    137      * Get signal level as an int from 0..4
    138      */
    139     @Override
    140     public int getLevel() {
    141         int levelRsrp = 0;
    142         int levelRssnr = 0;
    143 
    144         if (mRsrp == Integer.MAX_VALUE) levelRsrp = 0;
    145         else if (mRsrp >= -95) levelRsrp = SIGNAL_STRENGTH_GREAT;
    146         else if (mRsrp >= -105) levelRsrp = SIGNAL_STRENGTH_GOOD;
    147         else if (mRsrp >= -115) levelRsrp = SIGNAL_STRENGTH_MODERATE;
    148         else levelRsrp = SIGNAL_STRENGTH_POOR;
    149 
    150         // See RIL_LTE_SignalStrength in ril.h
    151         if (mRssnr == Integer.MAX_VALUE) levelRssnr = 0;
    152         else if (mRssnr >= 45) levelRssnr = SIGNAL_STRENGTH_GREAT;
    153         else if (mRssnr >= 10) levelRssnr = SIGNAL_STRENGTH_GOOD;
    154         else if (mRssnr >= -30) levelRssnr = SIGNAL_STRENGTH_MODERATE;
    155         else levelRssnr = SIGNAL_STRENGTH_POOR;
    156 
    157         int level;
    158         if (mRsrp == Integer.MAX_VALUE)
    159             level = levelRssnr;
    160         else if (mRssnr == Integer.MAX_VALUE)
    161             level = levelRsrp;
    162         else
    163             level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp;
    164 
    165         if (DBG) log("Lte rsrp level: " + levelRsrp
    166                 + " snr level: " + levelRssnr + " level: " + level);
    167         return level;
    168     }
    169 
    170     /**
    171      * Get reference signal received quality
    172      */
    173     public int getRsrq() {
    174         return mRsrq;
    175     }
    176 
    177     /**
    178      * Get reference signal signal-to-noise ratio
    179      */
    180     public int getRssnr() {
    181         return mRssnr;
    182     }
    183 
    184     /**
    185      * Get reference signal received power
    186      */
    187     public int getRsrp() {
    188         return mRsrp;
    189     }
    190 
    191     /**
    192      * Get channel quality indicator
    193      */
    194     public int getCqi() {
    195         return mCqi;
    196     }
    197 
    198     /**
    199      * Get signal strength as dBm
    200      */
    201     @Override
    202     public int getDbm() {
    203         return mRsrp;
    204     }
    205 
    206     /**
    207      * Get the LTE signal level as an asu value between 0..97, 99 is unknown
    208      * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
    209      */
    210     @Override
    211     public int getAsuLevel() {
    212         int lteAsuLevel = 99;
    213         int lteDbm = getDbm();
    214         if (lteDbm == Integer.MAX_VALUE) lteAsuLevel = 99;
    215         else if (lteDbm <= -140) lteAsuLevel = 0;
    216         else if (lteDbm >= -43) lteAsuLevel = 97;
    217         else lteAsuLevel = lteDbm + 140;
    218         if (DBG) log("Lte Asu level: "+lteAsuLevel);
    219         return lteAsuLevel;
    220     }
    221 
    222     /**
    223      * Get the timing advance value for LTE, as a value between 0..63.
    224      * Integer.MAX_VALUE is reported when there is no active RRC
    225      * connection. Refer to 3GPP 36.213 Sec 4.2.3
    226      * @return the LTE timing advance, if available.
    227      */
    228     public int getTimingAdvance() {
    229         return mTimingAdvance;
    230     }
    231 
    232     @Override
    233     public int hashCode() {
    234         int primeNum = 31;
    235         return (mSignalStrength * primeNum) + (mRsrp * primeNum)
    236                 + (mRsrq * primeNum) + (mRssnr * primeNum) + (mCqi * primeNum)
    237                 + (mTimingAdvance * primeNum);
    238     }
    239 
    240     @Override
    241     public boolean equals (Object o) {
    242         CellSignalStrengthLte s;
    243 
    244         try {
    245             s = (CellSignalStrengthLte) o;
    246         } catch (ClassCastException ex) {
    247             return false;
    248         }
    249 
    250         if (o == null) {
    251             return false;
    252         }
    253 
    254         return mSignalStrength == s.mSignalStrength
    255                 && mRsrp == s.mRsrp
    256                 && mRsrq == s.mRsrq
    257                 && mRssnr == s.mRssnr
    258                 && mCqi == s.mCqi
    259                 && mTimingAdvance == s.mTimingAdvance;
    260     }
    261 
    262     /**
    263      * @return string representation.
    264      */
    265     @Override
    266     public String toString() {
    267         return "CellSignalStrengthLte:"
    268                 + " ss=" + mSignalStrength
    269                 + " rsrp=" + mRsrp
    270                 + " rsrq=" + mRsrq
    271                 + " rssnr=" + mRssnr
    272                 + " cqi=" + mCqi
    273                 + " ta=" + mTimingAdvance;
    274     }
    275 
    276     /** Implement the Parcelable interface */
    277     @Override
    278     public void writeToParcel(Parcel dest, int flags) {
    279         if (DBG) log("writeToParcel(Parcel, int): " + toString());
    280         dest.writeInt(mSignalStrength);
    281         // Need to multiply rsrp and rsrq by -1
    282         // to ensure consistency when reading values written here
    283         // unless the values are invalid
    284         dest.writeInt(mRsrp * (mRsrp != Integer.MAX_VALUE ? -1 : 1));
    285         dest.writeInt(mRsrq * (mRsrq != Integer.MAX_VALUE ? -1 : 1));
    286         dest.writeInt(mRssnr);
    287         dest.writeInt(mCqi);
    288         dest.writeInt(mTimingAdvance);
    289     }
    290 
    291     /**
    292      * Construct a SignalStrength object from the given parcel
    293      * where the token is already been processed.
    294      */
    295     private CellSignalStrengthLte(Parcel in) {
    296         mSignalStrength = in.readInt();
    297         // rsrp and rsrq are written into the parcel as positive values.
    298         // Need to convert into negative values unless the values are invalid
    299         mRsrp = in.readInt();
    300         if (mRsrp != Integer.MAX_VALUE) mRsrp *= -1;
    301         mRsrq = in.readInt();
    302         if (mRsrq != Integer.MAX_VALUE) mRsrq *= -1;
    303         mRssnr = in.readInt();
    304         mCqi = in.readInt();
    305         mTimingAdvance = in.readInt();
    306         if (DBG) log("CellSignalStrengthLte(Parcel): " + toString());
    307     }
    308 
    309     /** Implement the Parcelable interface */
    310     @Override
    311     public int describeContents() {
    312         return 0;
    313     }
    314 
    315     /** Implement the Parcelable interface */
    316     @SuppressWarnings("hiding")
    317     public static final Parcelable.Creator<CellSignalStrengthLte> CREATOR =
    318             new Parcelable.Creator<CellSignalStrengthLte>() {
    319         @Override
    320         public CellSignalStrengthLte createFromParcel(Parcel in) {
    321             return new CellSignalStrengthLte(in);
    322         }
    323 
    324         @Override
    325         public CellSignalStrengthLte[] newArray(int size) {
    326             return new CellSignalStrengthLte[size];
    327         }
    328     };
    329 
    330     /**
    331      * log
    332      */
    333     private static void log(String s) {
    334         Rlog.w(LOG_TAG, s);
    335     }
    336 }
    337