Commit b9e6d2a4 authored by Alex Blasche's avatar Alex Blasche
Browse files

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: default avatarTimur Pocheptsov <Timur.Pocheptsov@digia.com>
Reviewed-by: default avatarAlex Blasche <alexander.blasche@digia.com>
Showing with 28 additions and 1 deletion
......@@ -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
......
......@@ -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;
......
......@@ -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);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment