From b9e6d2a484aea7ab8a7053adabf94780129e11e2 Mon Sep 17 00:00:00 2001
From: Alex Blasche <alexander.blasche@digia.com>
Date: Tue, 28 Oct 2014 13:44:45 +0100
Subject: [PATCH] Fix lowenergyscanner ui bugs when QLEController connection
 errors

1.) The QLEController may error out during connectToDevice() which does
not require the eventloop to run. At the same time the services view
is not yet loaded. Subsequently the services view never notices the
errors and loads as if the controller is still trying to connect.

2.) The services view can only be left when a disconnect() signal is
received. During a connection error the disconnect never happens
because the connect never happened. Artificially introduce a disconnect()
when the controller is not connected but disconnect was called by the UI.
This part should be cleaned up to properly allow tracking of the
controller's state in the future.

Change-Id: I2cbd90d55b5e70fb275a8f4563d9436419874e6d
Reviewed-by: Timur Pocheptsov <Timur.Pocheptsov@digia.com>
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
---
 .../lowenergyscanner/assets/Services.qml        | 10 ++++++++++
 examples/bluetooth/lowenergyscanner/device.cpp  | 17 ++++++++++++++++-
 examples/bluetooth/lowenergyscanner/device.h    |  2 ++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml
index e4e802d2..a433d445 100644
--- a/examples/bluetooth/lowenergyscanner/assets/Services.qml
+++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml
@@ -45,6 +45,16 @@ Rectangle {
     width: 300
     height: 600
 
+    Component.onCompleted: {
+        // Loading this page may take longer than QLEController
+        // stopping with an error, go back and readjust this view
+        // based on controller errors
+        if (device.controllerError) {
+            info.visible = false;
+            menu.menuText = device.update
+        }
+    }
+
     Header {
         id: header
         anchors.top: parent.top
diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp
index acab48c2..b8d61fe3 100644
--- a/examples/bluetooth/lowenergyscanner/device.cpp
+++ b/examples/bluetooth/lowenergyscanner/device.cpp
@@ -268,7 +268,15 @@ void Device::setUpdate(QString message)
 
 void Device::disconnectFromDevice()
 {
-    controller->disconnectFromDevice();
+    // UI always expects disconnect() signal when calling this signal
+    // TODO what is really needed is to extend state() to a multi value
+    // and thus allowing UI to keep track of controller progress in addition to
+    // device scan progress
+
+    if (controller->state() != QLowEnergyController::UnconnectedState)
+        controller->disconnectFromDevice();
+    else
+        deviceDisconnected();
 }
 
 void Device::deviceDisconnected()
@@ -316,6 +324,13 @@ bool Device::state()
     return m_deviceScanState;
 }
 
+bool Device::hasControllerError() const
+{
+    if (controller && controller->error() != QLowEnergyController::NoError)
+        return true;
+    return false;
+}
+
 bool Device::isRandomAddress() const
 {
     return randomAddress;
diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h
index 09b32599..049d1c61 100644
--- a/examples/bluetooth/lowenergyscanner/device.h
+++ b/examples/bluetooth/lowenergyscanner/device.h
@@ -66,6 +66,7 @@ class Device: public QObject
     Q_PROPERTY(QString update READ getUpdate NOTIFY updateChanged)
     Q_PROPERTY(bool useRandomAddress READ isRandomAddress WRITE setRandomAddress NOTIFY randomAddressChanged)
     Q_PROPERTY(bool state READ state NOTIFY stateChanged)
+    Q_PROPERTY(bool controllerError READ hasControllerError)
 public:
     Device();
     ~Device();
@@ -74,6 +75,7 @@ public:
     QVariant getCharacteristics();
     QString getUpdate();
     bool state();
+    bool hasControllerError() const;
 
     bool isRandomAddress() const;
     void setRandomAddress(bool newValue);
-- 
GitLab