CellSignalStrengthCdma.java revision dbf09ffed27b35cf310e3c53402edf0f56f5e7d1
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.telephony.Rlog;
22
23/**
24 * LTE signal strength related information.
25 */
26public 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     */
42    public CellSignalStrengthCdma() {
43        setDefaultValues();
44    }
45
46    /**
47     * Constructor
48     *
49     * @hide
50     */
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     */
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     */
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     */
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
101    public CellSignalStrengthCdma copy() {
102        return new CellSignalStrengthCdma(this);
103    }
104
105    /** @hide */
106    @Override
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
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 LTE signal level as an asu value between 0..97, 99 is unknown
140     * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
141     */
142    @Override
143    public int getAsuLevel() {
144        final int cdmaDbm = getCdmaDbm();
145        final int cdmaEcio = getCdmaEcio();
146        int cdmaAsuLevel;
147        int ecioAsuLevel;
148
149        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 >= -90) ecioAsuLevel = 16;
158        else if (cdmaEcio >= -100) ecioAsuLevel = 8;
159        else if (cdmaEcio >= -115) ecioAsuLevel = 4;
160        else if (cdmaEcio >= -130) ecioAsuLevel = 2;
161        else if (cdmaEcio >= -150) ecioAsuLevel = 1;
162        else ecioAsuLevel = 99;
163
164        int level = (cdmaAsuLevel < ecioAsuLevel) ? cdmaAsuLevel : ecioAsuLevel;
165        if (DBG) log("getAsuLevel=" + level);
166        return level;
167    }
168
169    /**
170     * Get cdma as level 0..4
171     */
172    public int getCdmaLevel() {
173        final int cdmaDbm = getCdmaDbm();
174        final int cdmaEcio = getCdmaEcio();
175        int levelDbm;
176        int levelEcio;
177
178        if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
179        else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
180        else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
181        else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR;
182        else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
183
184        // Ec/Io are in dB*10
185        if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
186        else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
187        else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
188        else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR;
189        else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
190
191        int level = (levelDbm < levelEcio) ? levelDbm : levelEcio;
192        if (DBG) log("getCdmaLevel=" + level);
193        return level;
194    }
195
196    /**
197     * Get Evdo as level 0..4
198     */
199    public int getEvdoLevel() {
200        int evdoDbm = getEvdoDbm();
201        int evdoSnr = getEvdoSnr();
202        int levelEvdoDbm;
203        int levelEvdoSnr;
204
205        if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
206        else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
207        else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
208        else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
209        else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
210
211        if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
212        else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
213        else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
214        else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR;
215        else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
216
217        int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
218        if (DBG) log("getEvdoLevel=" + level);
219        return level;
220    }
221
222    /**
223     * Get the signal strength as dBm
224     */
225    @Override
226    public int getDbm() {
227        int cdmaDbm = getCdmaDbm();
228        int evdoDbm = getEvdoDbm();
229
230        // Use the lower value to be conservative
231        return (cdmaDbm < evdoDbm) ? cdmaDbm : evdoDbm;
232    }
233
234    /**
235     * Get the CDMA RSSI value in dBm
236     */
237    public int getCdmaDbm() {
238        return mCdmaDbm;
239    }
240    /** @hide */
241    public void setCdmaDbm(int cdmaDbm) {
242        mCdmaDbm = cdmaDbm;
243    }
244
245    /**
246     * Get the CDMA Ec/Io value in dB*10
247     */
248    public int getCdmaEcio() {
249        return mCdmaEcio;
250    }
251    /** @hide */
252    public void setCdmaEcio(int cdmaEcio) {
253        mCdmaEcio = cdmaEcio;
254    }
255
256    /**
257     * Get the EVDO RSSI value in dBm
258     */
259    public int getEvdoDbm() {
260        return mEvdoDbm;
261    }
262    /** @hide */
263    public void setEvdoDbm(int evdoDbm) {
264        mEvdoDbm = evdoDbm;
265    }
266
267    /**
268     * Get the EVDO Ec/Io value in dB*10
269     */
270    public int getEvdoEcio() {
271        return mEvdoEcio;
272    }
273    /** @hide */
274    public void setEvdoEcio(int evdoEcio) {
275        mEvdoEcio = evdoEcio;
276    }
277
278    /**
279     * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest.
280     */
281    public int getEvdoSnr() {
282        return mEvdoSnr;
283    }
284    /** @hide */
285    public void setEvdoSnr(int evdoSnr) {
286        mEvdoSnr = evdoSnr;
287    }
288
289    @Override
290    public int hashCode() {
291        int primeNum = 31;
292        return ((mCdmaDbm * primeNum) + (mCdmaEcio * primeNum)
293                + (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum));
294    }
295
296    @Override
297    public boolean equals (Object o) {
298        CellSignalStrengthCdma s;
299
300        try {
301            s = (CellSignalStrengthCdma) o;
302        } catch (ClassCastException ex) {
303            return false;
304        }
305
306        if (o == null) {
307            return false;
308        }
309
310        return mCdmaDbm == s.mCdmaDbm
311                && mCdmaEcio == s.mCdmaEcio
312                && mEvdoDbm == s.mEvdoDbm
313                && mEvdoEcio == s.mEvdoEcio
314                && mEvdoSnr == s.mEvdoSnr;
315    }
316
317    /**
318     * @return string representation.
319     */
320    @Override
321    public String toString() {
322        return "CellSignalStrengthCdma:"
323                + " cdmaDbm=" + mCdmaDbm
324                + " cdmaEcio=" + mCdmaEcio
325                + " evdoDbm=" + mEvdoDbm
326                + " evdoEcio=" + mEvdoEcio
327                + " evdoSnr=" + mEvdoSnr;
328    }
329
330    /** Implement the Parcelable interface */
331    @Override
332    public void writeToParcel(Parcel dest, int flags) {
333        if (DBG) log("writeToParcel(Parcel, int): " + toString());
334        // Need to multiply CdmaDbm, CdmaEcio, EvdoDbm and EvdoEcio by -1
335        // to ensure consistency when reading values written here
336        dest.writeInt(mCdmaDbm * -1);
337        dest.writeInt(mCdmaEcio * -1);
338        dest.writeInt(mEvdoDbm * -1);
339        dest.writeInt(mEvdoEcio * -1);
340        dest.writeInt(mEvdoSnr);
341    }
342
343    /**
344     * Construct a SignalStrength object from the given parcel
345     * where the TYPE_LTE token is already been processed.
346     */
347    private CellSignalStrengthCdma(Parcel in) {
348        // CdmaDbm, CdmaEcio, EvdoDbm and EvdoEcio are written into
349        // the parcel as positive values.
350        // Need to convert into negative values
351        mCdmaDbm = in.readInt() * -1;
352        mCdmaEcio = in.readInt() * -1;
353        mEvdoDbm = in.readInt() * -1;
354        mEvdoEcio = in.readInt() * -1;
355        mEvdoSnr = in.readInt();
356        if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString());
357    }
358
359    /** Implement the Parcelable interface */
360    @Override
361    public int describeContents() {
362        return 0;
363    }
364
365    /** Implement the Parcelable interface */
366    @SuppressWarnings("hiding")
367    public static final Parcelable.Creator<CellSignalStrengthCdma> CREATOR =
368            new Parcelable.Creator<CellSignalStrengthCdma>() {
369        @Override
370        public CellSignalStrengthCdma createFromParcel(Parcel in) {
371            return new CellSignalStrengthCdma(in);
372        }
373
374        @Override
375        public CellSignalStrengthCdma[] newArray(int size) {
376            return new CellSignalStrengthCdma[size];
377        }
378    };
379
380    /**
381     * log
382     */
383    private static void log(String s) {
384        Rlog.w(LOG_TAG, s);
385    }
386}
387