RssiCurvepublic class RssiCurve extends Object implements android.os.ParcelableA curve defining the network score over a range of RSSI values.
For each RSSI bucket, the score may be any byte. Scores have no absolute meaning and are only
considered relative to other scores assigned by the same scorer. Networks with no score are
treated equivalently to a network with score {@link Byte#MIN_VALUE}, and will not be used.
For example, consider a curve starting at -110 dBm with a bucket width of 10 and the
following buckets: {@code [-20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]}.
This represents a linear curve between -110 dBm and 30 dBm. It scores progressively higher at
stronger signal strengths.
A network can be assigned a fixed score independent of RSSI by setting
{@link #rssiBuckets} to a one-byte array whose element is the fixed score. {@link #start}
should be set to the lowest RSSI value at which this fixed score should apply, and
{@link #bucketWidth} should be set such that {@code start + bucketWidth} is equal to the
highest RSSI value at which this fixed score should apply.
Note that RSSI values below -110 dBm or above 30 dBm are unlikely to cause any difference
in connectivity behavior from those endpoints. That is, the connectivity framework will treat
a network with a -120 dBm signal exactly as it would treat one with a -110 dBm signal.
Therefore, graphs which specify scores outside this range may be truncated to this range by
the system. |
Fields Summary |
---|
private static final int | DEFAULT_ACTIVE_NETWORK_RSSI_BOOST | public final int | startThe starting dBm of the curve. | public final int | bucketWidthThe width of each RSSI bucket, in dBm. | public final byte[] | rssiBucketsThe score for each RSSI bucket. | public final int | activeNetworkRssiBoostThe RSSI boost to give this network when active, in dBm.
When the system is connected to this network, it will pretend that the network has this
much higher of an RSSI. This is to avoid switching networks when another network has only a
slightly higher score. | public static final Creator | CREATOR |
Constructors Summary |
---|
public RssiCurve(int start, int bucketWidth, byte[] rssiBuckets)Construct a new {@link RssiCurve}.
this(start, bucketWidth, rssiBuckets, DEFAULT_ACTIVE_NETWORK_RSSI_BOOST);
| public RssiCurve(int start, int bucketWidth, byte[] rssiBuckets, int activeNetworkRssiBoost)Construct a new {@link RssiCurve}.
this.start = start;
this.bucketWidth = bucketWidth;
if (rssiBuckets == null || rssiBuckets.length == 0) {
throw new IllegalArgumentException("rssiBuckets must be at least one element large.");
}
this.rssiBuckets = rssiBuckets;
this.activeNetworkRssiBoost = activeNetworkRssiBoost;
| private RssiCurve(android.os.Parcel in)
start = in.readInt();
bucketWidth = in.readInt();
int bucketCount = in.readInt();
rssiBuckets = new byte[bucketCount];
in.readByteArray(rssiBuckets);
activeNetworkRssiBoost = in.readInt();
|
Methods Summary |
---|
public int | describeContents()
return 0;
| public boolean | equals(java.lang.Object o)Determine if two RSSI curves are defined in the same way.
Note that two curves can be equivalent but defined differently, e.g. if one bucket in one
curve is split into two buckets in another. For the purpose of this method, these curves are
not considered equal to each other.
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RssiCurve rssiCurve = (RssiCurve) o;
return start == rssiCurve.start &&
bucketWidth == rssiCurve.bucketWidth &&
Arrays.equals(rssiBuckets, rssiCurve.rssiBuckets) &&
activeNetworkRssiBoost == rssiCurve.activeNetworkRssiBoost;
| public int | hashCode()
return Objects.hash(start, bucketWidth, rssiBuckets, activeNetworkRssiBoost);
| public byte | lookupScore(int rssi)Lookup the score for a given RSSI value.
return lookupScore(rssi, false /* isActiveNetwork */);
| public byte | lookupScore(int rssi, boolean isActiveNetwork)Lookup the score for a given RSSI value.
if (isActiveNetwork) {
rssi += activeNetworkRssiBoost;
}
int index = (rssi - start) / bucketWidth;
// Snap the index to the closest bucket if it falls outside the curve.
if (index < 0) {
index = 0;
} else if (index > rssiBuckets.length - 1) {
index = rssiBuckets.length - 1;
}
return rssiBuckets[index];
| public java.lang.String | toString()
StringBuilder sb = new StringBuilder();
sb.append("RssiCurve[start=")
.append(start)
.append(",bucketWidth=")
.append(bucketWidth)
.append(",activeNetworkRssiBoost=")
.append(activeNetworkRssiBoost);
sb.append(",buckets=");
for (int i = 0; i < rssiBuckets.length; i++) {
sb.append(rssiBuckets[i]);
if (i < rssiBuckets.length - 1) {
sb.append(",");
}
}
sb.append("]");
return sb.toString();
| public void | writeToParcel(android.os.Parcel out, int flags)
out.writeInt(start);
out.writeInt(bucketWidth);
out.writeInt(rssiBuckets.length);
out.writeByteArray(rssiBuckets);
out.writeInt(activeNetworkRssiBoost);
|
|