async Task OnConnectDeviceCommand(ConnectDeviceCommand arg) { var device = await _deviceManager.ConnectDevice(arg.Mac, SdkConfig.ConnectDeviceTimeout); if (device == null) { device = await _deviceManager.ConnectDevice(arg.Mac, SdkConfig.ConnectDeviceTimeout / 2); } if (device != null) { await device.WaitInitialization(SdkConfig.DeviceInitializationTimeout, default); } await _hub.Publish(new ConnectDeviceResponse(device, arg.Mac)); }
public async Task <IDevice> ConnectVault(string mac, bool rebondOnFail, CancellationToken ct) { ct.ThrowIfCancellationRequested(); if (_bondManager.Exists(mac)) { await _ui.SendNotification(TranslationSource.Instance["ConnectionFlow.Connection.Stage1"], mac); } else { await _ui.SendNotification(TranslationSource.Instance["ConnectionFlow.Connection.Stage1.PressButton"], mac); } bool ltkErrorOccured = false; IDevice device = null; try { device = await _deviceManager.ConnectDevice(mac, SdkConfig.ConnectDeviceTimeout); } catch (Exception ex) // Thrown when LTK error occurs in csr { WriteLine(ex); ltkErrorOccured = true; } if (device == null) { ct.ThrowIfCancellationRequested(); string ltk = ""; if (ltkErrorOccured) { ltk = "LTK error."; ltkErrorOccured = false; } if (_bondManager.Exists(mac)) { await _ui.SendNotification(ltk + TranslationSource.Instance["ConnectionFlow.Connection.Stage2"], mac); } else { await _ui.SendNotification(ltk + TranslationSource.Instance["ConnectionFlow.Connection.Stage2.PressButton"], mac); } try { device = await _deviceManager.ConnectDevice(mac, SdkConfig.ConnectDeviceTimeout / 2); } catch (Exception ex) // Thrown when LTK error occurs in csr { WriteLine(ex); ltkErrorOccured = true; } if (device == null && rebondOnFail) { ct.ThrowIfCancellationRequested(); // remove the bond and try one more time await _deviceManager.RemoveByMac(mac); if (ltkErrorOccured) { await _ui.SendNotification(TranslationSource.Instance["ConnectionFlow.Connection.Stage3.LtkError.PressButton"], mac); // TODO: Fix LTK error in CSR } else { await _ui.SendNotification(TranslationSource.Instance["ConnectionFlow.Connection.Stage3.PressButton"], mac); } device = await _deviceManager.ConnectDevice(mac, SdkConfig.ConnectDeviceTimeout); } } if (device == null) { throw new WorkflowException(TranslationSource.Instance.Format("ConnectionFlow.Connection.ConnectionFailed", mac)); } return(device); }