Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 2
0
        private PeripheralDiscoveredEventArgs LoadFromCache(string address)
        {
            ThrowIfDisposed();
            PeripheralDiscoveredEventArgs args = null;

            _discoveredPeripheralCache.TryGetValue(address, out args);
            return(args);
        }
Ejemplo n.º 3
0
        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);
                }
            }
        }
Ejemplo n.º 4
0
 protected void PeripheralWasDiscovered(PeripheralDiscoveredEventArgs args)
 {
     ThrowIfDisposed();
     CacheAndUpdate(args);
     PeripheralDiscovered?.Invoke(this, args);
 }