public void Scan(CancellationToken scanToken, CancellationToken appToken, int scanTimeoutInMilliseconds,
                  Action <BgBleDevice> processDevices)
 {
     try
     {
         var lockTaken = false;
         Monitor.TryEnter(ThreadLock, 150, ref lockTaken);
         if (lockTaken)
         {
             if (_busy)
             {
                 return;
             }
             _busy = true;
             Monitor.Exit(ThreadLock);
         }
         _deviceNotifications = processDevices;
         _bglib.SendCommand(_serialPort, _bglib.BLECommandGAPSetScanParameters(0xC8, 0xC8, 1));
         _bglib.SendCommand(_serialPort, _bglib.BLECommandGAPDiscover(1));
         WaitHandle.WaitAny(new[] { scanToken.WaitHandle }, scanTimeoutInMilliseconds);
         // cleanup takes 125ms
         _bglib.SendCommand(_serialPort, _bglib.BLECommandGAPEndProcedure());
         _deviceNotifications = null;
         WaitHandle.WaitAny(new[] { appToken.WaitHandle }, 130);
     }
     catch (Exception exception)
     {
         _logger.LogWarning(exception,
                            $"ControlPlus Repository: Unable to scan via Com port {_serialPort.PortName}");
     }
     _busy = false;
 }
Пример #2
0
        /// <summary>
        /// Start device discovery
        /// </summary>
        public void StartDeviceDiscovery()
        {
            _logger?.LogDebug("Start device discovery");

            _bgLib.BLEEventGAPScanResponse += OnScanResponse;

            _bgLib.SendCommand(_bleModuleConnection.SerialPort, _bgLib.BLECommandGAPSetScanParameters(0xC8, 0xC8, 1));
            _bgLib.SendCommand(_bleModuleConnection.SerialPort, _bgLib.BLECommandGAPDiscover(1));
        }
Пример #3
0
        public async Task GAPSetScanParametersAsync(int scanIntervalMs, int scanWindowMs, bool activeScanningEnabled)
        {
            const int TIMEOUT_MS = 6000;

            var  scanInt    = (ushort)ConvertMsTo625UsUnits(scanIntervalMs);
            var  scanWin    = (ushort)ConvertMsTo625UsUnits(scanWindowMs);
            byte activeScan = activeScanningEnabled ? (byte)1 : (byte)0;

            var cmd = _bglib.BLECommandGAPSetScanParameters(scanInt, scanWin, activeScan);
            await _bglib.SendCommandAsync(cmd).ConfigureAwait(false);

            using (var cts = new CancellationTokenSource(TIMEOUT_MS)) {
                bool didTimeout = false;
                try { await _cmdRespWaitHandle.WaitAsync(cts.Token).ConfigureAwait(false); }
                catch (OperationCanceledException) { didTimeout = true; }
                if (didTimeout)
                {
                    throw new TimeoutException();
                }
            }

            if (_lastResult == 0)
            {
                return;
            }

            var error = (BGErrorCode)Enum.ToObject(typeof(BGErrorCode), _lastResult);

            // Continue on if this error is received. Happens at times but not critical error
            if (error == BGErrorCode.DeviceInWrongState)
            {
                Debug.WriteLine($"Warning: GAPSetScanParameters returned: error={error}");
                return;
            }

            string errMsg = $"GAPSetScanParameters returned: error={error} code={_lastResult:X4}";

            throw new Exception(errMsg);
        }