From 7b1b5620e11bb9f8f0f10fce866fbea3777a9484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 22 Mar 2021 09:53:30 +0100 Subject: [PATCH] Clean up if setup failes for nuki --- nuki/integrationpluginnuki.cpp | 77 +++++++++++++++++----------------- nuki/integrationpluginnuki.h | 4 -- nuki/nuki.cpp | 1 + nuki/nukicontroller.cpp | 3 +- 4 files changed, 42 insertions(+), 43 deletions(-) diff --git a/nuki/integrationpluginnuki.cpp b/nuki/integrationpluginnuki.cpp index 203ddb34..cf0ff92f 100644 --- a/nuki/integrationpluginnuki.cpp +++ b/nuki/integrationpluginnuki.cpp @@ -129,7 +129,6 @@ void IntegrationPluginNuki::discoverThings(ThingDiscoveryInfo *info) m_bluetoothAdapter->startDiscovering(); QTimer::singleShot(5000, info, [this, info]() { onBluetoothDiscoveryFinished(info); }); - } void IntegrationPluginNuki::startPairing(ThingPairingInfo *info) @@ -159,14 +158,48 @@ void IntegrationPluginNuki::confirmPairing(ThingPairingInfo *info, const QString return info->finish(Thing::ThingErrorThingNotFound); } + // Create a temporary nuki for authentication BluetoothDevice *bluetoothDevice = m_bluetoothAdapter->getDevice(address); - m_asyncSetupNuki = new Nuki(nullptr, bluetoothDevice, this); - connect(m_asyncSetupNuki, &Nuki::authenticationProcessFinished, this, &IntegrationPluginNuki::onNukiAuthenticationProcessFinished); - connect(m_asyncSetupNuki, &Nuki::availableChanged, this, &IntegrationPluginNuki::onAsyncSetupNukiAvailableChanged); + connect(m_asyncSetupNuki, &Nuki::authenticationProcessFinished, this, [=](const PairingTransactionId &pairingId, bool success){ + if (m_asyncSetupNuki) { + qCDebug(dcNuki()) << "Deleting the temporary pairing device"; + m_asyncSetupNuki->deleteLater(); + m_asyncSetupNuki = nullptr; + } + + if (!m_pairingInfo) { + qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id"; + return; + } + + if (m_pairingInfo->transactionId() != pairingId) { + qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id"; + return; + } + + m_pairingInfo->finish(success ? Thing::ThingErrorNoError : Thing::ThingErrorHardwareFailure); + m_pairingInfo = nullptr; + }); + + connect(m_asyncSetupNuki, &Nuki::availableChanged, this, [=](bool available){ + // Remove possibly running Nuki setup devices on disconnected + if (m_asyncSetupNuki && !available) { + qCDebug(dcNuki()) << "Deleting the temporary pairing device"; + m_asyncSetupNuki->deleteLater(); + m_asyncSetupNuki = nullptr; + + // Lost connection during authentication + if (m_pairingInfo) { + qCWarning(dcNuki()) << "Device disconnected during pairing."; + m_pairingInfo->finish(Thing::ThingErrorHardwareFailure); + m_pairingInfo = nullptr; + } + } + }); - m_asyncSetupNuki->startAuthenticationProcess(info->transactionId()); m_pairingInfo = info; + m_asyncSetupNuki->startAuthenticationProcess(info->transactionId()); connect(info, &ThingPairingInfo::destroyed, this, [this] { m_pairingInfo = nullptr; }); } @@ -225,7 +258,7 @@ void IntegrationPluginNuki::thingRemoved(Thing *thing) Nuki *nuki = m_nukiDevices.key(thing); nuki->clearSettings(); - // FIXME: deauthenticate nymea from nuki thing + // TODO: deauthenticate nymea from nuki qCDebug(dcNuki()) << "Delete pairing information from bluez" << nuki->bluetoothDevice(); m_bluetoothAdapter->removeDevice(nuki->bluetoothDevice()->address()); @@ -298,35 +331,3 @@ void IntegrationPluginNuki::onBluetoothDiscoveryFinished(ThingDiscoveryInfo *inf info->finish(Thing::ThingErrorNoError); } - -void IntegrationPluginNuki::onAsyncSetupNukiAvailableChanged(bool available) -{ - // Remove possibly running Nuki setup devices on disconnected - if (!available && m_asyncSetupNuki) { - qCDebug(dcNuki()) << "Deleting the temporary pairing device"; - m_asyncSetupNuki->deleteLater(); - m_asyncSetupNuki = nullptr; - } -} - -void IntegrationPluginNuki::onNukiAuthenticationProcessFinished(const PairingTransactionId &pairingTransactionId, bool success) -{ - if (m_asyncSetupNuki) { - qCDebug(dcNuki()) << "Deleting the temporary pairing device"; - m_asyncSetupNuki->deleteLater(); - m_asyncSetupNuki = nullptr; - } - - if (!m_pairingInfo) { - qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id"; - return; - } - - if (m_pairingInfo->transactionId() != pairingTransactionId) { - qCWarning(dcNuki()) << "Authentication process finished, but have not valid pairing translaction id"; - return; - } - - m_pairingInfo->finish(success ? Thing::ThingErrorNoError : Thing::ThingErrorHardwareFailure); - m_pairingInfo = nullptr; -} diff --git a/nuki/integrationpluginnuki.h b/nuki/integrationpluginnuki.h index 27e6a719..08dcf05d 100644 --- a/nuki/integrationpluginnuki.h +++ b/nuki/integrationpluginnuki.h @@ -76,10 +76,6 @@ private slots: void onBluetoothEnabledChanged(const bool &enabled); void onBluetoothDiscoveryFinished(ThingDiscoveryInfo *info); - void onAsyncSetupNukiAvailableChanged(bool available); - - void onNukiAuthenticationProcessFinished(const PairingTransactionId &pairingTransactionId, bool success); - }; #endif // INTEGRATIONPLUGINNUKI_H diff --git a/nuki/nuki.cpp b/nuki/nuki.cpp index 1c5cef66..6c7d7390 100644 --- a/nuki/nuki.cpp +++ b/nuki/nuki.cpp @@ -153,6 +153,7 @@ void Nuki::printServices() void Nuki::readDeviceInformationCharacteristics() { + qCDebug(dcNuki()) << "Start reading device information"; m_initUuidsToRead.append(QBluetoothUuid::SerialNumberString); m_initUuidsToRead.append(QBluetoothUuid::HardwareRevisionString); m_initUuidsToRead.append(QBluetoothUuid::FirmwareRevisionString); diff --git a/nuki/nukicontroller.cpp b/nuki/nukicontroller.cpp index 895f6dad..3bfd6265 100644 --- a/nuki/nukicontroller.cpp +++ b/nuki/nukicontroller.cpp @@ -312,7 +312,8 @@ void NukiController::processUserDataNotification(const QByteArray nonce, quint32 if (command == NukiUtils::CommandNukiStates) { processNukiStatesData(payload); emit readNukiStatesFinished(true); - setState(NukiControllerStateReadingConfigurationRequestChallange); + // TODO: read configuration + setState(NukiControllerStateIdle); return; } break;