in src/Covi/Features/BluetoothTracing/DeviceManager/Internal/DefaultDeviceManager.cs [87:151]
public void HandleDeviceDiscovered(DeviceDescriptor deviceDescriptor, Action<DeviceDescriptor> onNext = null)
{
lock (_discoveryLock)
{
try
{
DeviceDescriptor descriptor = deviceDescriptor;
deviceDescriptor.Processing = true;
var existingDevice = _discoveredDevices.GetOrAdd(deviceDescriptor.Identifier, deviceDescriptor);
if (existingDevice != null && existingDevice != deviceDescriptor)
{
// If some other thread already processing - then cancel
if (!Monitor.TryEnter(deviceDescriptor.ProcessingLock))
{
return;
}
try
{
// TODO: log contact time here for further analysis of exposure time and signal strength
if (!existingDevice.Processing && !existingDevice.Ignore)
{
// Avoid processing already processed devices
if (existingDevice.Processed)
{
if (DateTime.UtcNow - existingDevice.DiscoveryTime <=
Configuration.Constants.BluetoothConstants.DeviceThrottleTime)
{
return;
}
}
//Update context information
existingDevice.Context = deviceDescriptor.Context;
existingDevice.DiscoveryTime = deviceDescriptor.DiscoveryTime;
existingDevice.RSSI = deviceDescriptor.RSSI;
existingDevice.Processing = true;
existingDevice.Processed = false;
descriptor = existingDevice;
}
else
{
// device already being processed
return;
}
}
finally
{
Monitor.Exit(deviceDescriptor.ProcessingLock);
}
}
_logger.LogDebug($"DeviceManager - Device Discovered - Connecting. id: {descriptor.Identifier}.");
onNext?.Invoke(descriptor);
InvokeCleanupIfNeeded();
}
catch (Exception e)
{
_logger.LogError(
e, $"DeviceManager - Device Discovered - Error. id: {deviceDescriptor.Identifier}.");
}
}
}