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; }
/// <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)); }
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); }