in rx-central-ble/src/main/java/com/uber/rxcentralble/core/matchers/RssiScanMatcher.java [40:72]
public ObservableTransformer<ScanData, ScanData> match() {
return scanDataStream ->
scanDataStream
.doOnSubscribe(disposable -> matches.clear())
.compose(serviceScanMatcher.match())
.doOnNext(scanData -> {
synchronized (syncRoot) {
matches.put(scanData.getBluetoothDevice().getAddress(), scanData);
}
})
.delay(matchDelayMs, TimeUnit.MILLISECONDS)
.filter(match -> {
synchronized (syncRoot) {
for (ScanData other : matches.values()) {
// Skip our self.
if (other.getBluetoothDevice().getAddress().contentEquals(
match.getBluetoothDevice().getAddress())) {
continue;
}
// If the other match is closer then do not match.
// RSSI is measured in dB; negative values, closer to zero indicates
// stronger signal.
if (other.getRssi() > match.getRssi()) {
return false;
}
}
// This is our match.
return true;
}
});
}