startScan method

Future<void> startScan({
  1. Duration? timeout,
})

Implementation

Future<void> startScan({Duration? timeout}) async {
  if (!_isInitialized) {
    throw Exception(
        'DeviceManager not initialized. Call initialize() first.');
  }

  if (_isScanning) {
    throw Exception('Scan is already in progress');
  }

  if (FlutterBluePlus.adapterStateNow != BluetoothAdapterState.on) {
    if (Platform.isAndroid) {
      await FlutterBluePlus.turnOn();
      await FlutterBluePlus.adapterState
          .where((state) => state == BluetoothAdapterState.on)
          .first
          .timeout(const Duration(seconds: 10));
    } else {
      throw Exception('Bluetooth is not enabled');
    }
  }

  _discoveredDevices.clear();
  _isScanning = true;

  try {
    _scanSubscription = FlutterBluePlus.scanResults.listen((results) {
      _discoveredDevices.clear();
      for (final result in results) {
        if (result.device.platformName.isNotEmpty) {
          _discoveredDevices.add(OmiDevice.fromScanResult(result));
        }
      }
      if (!_devicesController.isClosed) {
        _devicesController.add(List.unmodifiable(_discoveredDevices));
      }
    });

    await FlutterBluePlus.startScan(
      timeout: timeout ?? const Duration(seconds: 10),
      withServices: [
        Guid(DeviceConstants.omiServiceUuid),
        Guid(DeviceConstants.frameServiceUuid),
      ],
    );
  } catch (e) {
    _isScanning = false;
    rethrow;
  } finally {
    _isScanning = false;
  }
}