Esempio n. 1
0
        private async Task <IDevice?> Initialize(Lock @lock, LockKey key)
        {
            if (_adapter.Status != AdapterStatus.PoweredOn)
            {
                if (!(_adapter.CanControlAdapterState() && await TurnOnBle()))
                {
                    await _dialogService.ShowError("Bluetooth anschalten",
                                                   "Schalten Sie Bluetooth ein, um das Schloss zu bedienen");

                    return(null);
                }

                Task <bool> TurnOnBle()
                {
                    TaskCompletionSource <bool> bleResult = new TaskCompletionSource <bool>();

                    _adapter.WhenStatusChanged()
                    .Timeout(MaxTurnOnBluetoothDuration)
                    .Subscribe(status =>
                    {
                        if (status == AdapterStatus.PoweredOn)
                        {
                            bleResult.TrySetResult(true);
                        }
                    }, exception =>
                    {
                        bleResult.TrySetResult(false);
                    });

                    try
                    {
                        _adapter.SetAdapterState(true);
                    }
                    catch (Exception)
                    {
                        return(Task.FromResult(false));
                    }

                    return(bleResult.Task);
                }
            }

            var result = new TaskCompletionSource <IDevice?>();

            _adapter.ScanUntilDeviceFound(@lock.Name)
            .Take(1)
            .Timeout(MaxScanDuration)
            .Subscribe(device =>
            {
                device.WhenConnected().Take(1).Subscribe(async _ =>
                {
                    var success = await Authenticate(key, device);

                    if (success)
                    {
                        result.TrySetResult(device);
                    }
                    else
                    {
                        result.TrySetResult(null);
                        await _dialogService.ShowError("Authentifizierung fehlgeschlagen",
                                                       "Das Schloss konnte aufgrund eines Fehlers mit der Authentifizierung nicht geöffnet werden.");
                    }
                }, async exception =>
                {
                    result.TrySetResult(null);
                    await _dialogService.ShowError("Verbindung fehlgeschlagen",
                                                   "Die Verbindung zum Schloss ist fehlgeschlagen, obwohl das Schloss gefunden wurde.");
                });

                device.Connect(new ConnectionConfig
                {
                    AutoConnect = false
                });
            }, async exception =>
            {
                await _dialogService.ShowError("Schloss wurde nicht gefunden",
                                               "Das Schloss konnte nicht gefunden werden.");
                result.TrySetResult(null);
            });

            return(await result.Task);
        }