private void CacheAndUpdate(PeripheralDiscoveredEventArgs args) { if (State == CentralManagerState.Disposed) { return; } var address = args.Peripheral.Address; var newPeripheral = args.Peripheral; var cachedArgs = LoadFromCache(address); if (cachedArgs == null) { _discoveredPeripheralCache.TryAdd(address, args); } else { // update cache by starting with the received-args and updating ScanResponse and LocalName // from the cache if they don't exist, then replace the cached-args with the newly updated // received-args. var cachedPeripheral = cachedArgs.Peripheral; newPeripheral.LocalName = cachedPeripheral.LocalName; if (args.ScanResponseData == null || args.ScanResponseData.Length == 0) { args.ScanResponseData = cachedArgs.ScanResponseData; } } }
private PeripheralDiscoveredEventArgs LoadFromCache(string address) { ThrowIfDisposed(); PeripheralDiscoveredEventArgs args = null; _discoveredPeripheralCache.TryGetValue(address, out args); return(args); }
private void BGApi_OnGAPScanResponse(object sender, ScanResponseEventArgs e) { if (State == CentralManagerState.Disposed) { return; } try { if (State != CentralManagerState.Scanning) { // Should not enter this unless device is in a weird state, // most likely it was scanning and not told to stop. Attempt // stop scanning and reset state. Debug.WriteLine("Received a BGApi_OnGAPScanResponse at an unexpected time, attempting to reset..."); if (_softResetTask != null) { return; } _softResetTask = SoftResetDongleState(); _softResetTask.ContinueWith(task => { _softResetTask = null; if (task.IsFaulted) { Debug.Fail($"Received a BGApi_OnGAPScanResponse at an unexpected time and attempts to recover failed: {task.Exception.Message}"); } }); return; } var addressType = (BGGAPAdvertiserAddressType)Enum.ToObject(typeof(BGGAPAdvertiserAddressType), e.address_type); var isPublicAddress = addressType == BGGAPAdvertiserAddressType.PublicAddress; var address = e.sender.ToHexString(); var packetType = (BGGAPPacketType)Enum.ToObject(typeof(BGGAPPacketType), e.packet_type); var adData = (packetType != BGGAPPacketType.ScanResponse ? e.data : null) ?? new byte[0]; var respData = (packetType == BGGAPPacketType.ScanResponse ? e.data : null) ?? new byte[0]; var isConnectable = packetType == BGGAPPacketType.ConnectableAd; var peripheral = new BGPeripheral(address, isPublicAddress, _bgApi, e.rssi); var peripheralDiscoveredArgs = new PeripheralDiscoveredEventArgs { Peripheral = peripheral, AdvertisementData = adData, ScanResponseData = respData, IsConnectable = isConnectable, RSSI = e.rssi }; PeripheralWasDiscovered(peripheralDiscoveredArgs); } catch (Exception ex) { if (_scanningExceptionToRethow == null) { _scanningExceptionToRethow = ExceptionDispatchInfo.Capture(ex); } } }
protected void PeripheralWasDiscovered(PeripheralDiscoveredEventArgs args) { ThrowIfDisposed(); CacheAndUpdate(args); PeripheralDiscovered?.Invoke(this, args); }