summaryrefslogtreecommitdiffstats
path: root/src/bluetooth
diff options
context:
space:
mode:
Diffstat (limited to 'src/bluetooth')
-rw-r--r--src/bluetooth/qlowenergycontrollernew.cpp10
-rw-r--r--src/bluetooth/qlowenergycontrollernew_bluez.cpp4
-rw-r--r--src/bluetooth/qlowenergycontrollernew_p.cpp2
-rw-r--r--src/bluetooth/qlowenergycontrollernew_p.h3
-rw-r--r--src/bluetooth/qlowenergyservice.cpp66
-rw-r--r--src/bluetooth/qlowenergyservice.h20
6 files changed, 96 insertions, 9 deletions
diff --git a/src/bluetooth/qlowenergycontrollernew.cpp b/src/bluetooth/qlowenergycontrollernew.cpp
index 967b1a87..0a9800ae 100644
--- a/src/bluetooth/qlowenergycontrollernew.cpp
+++ b/src/bluetooth/qlowenergycontrollernew.cpp
@@ -100,6 +100,14 @@ void QLowEnergyControllerNewPrivate::setState(
emit q->stateChanged(state);
}
+void QLowEnergyControllerNewPrivate::invalidateServices()
+{
+ foreach (const QBluetoothUuid &service, serviceList.keys()) {
+ ServiceDetails detail = serviceList.take(service);
+ detail.service.data()->setState(QLowEnergyService::InvalidService);
+ }
+}
+
QLowEnergyControllerNew::QLowEnergyControllerNew(
const QBluetoothAddress &remoteDevice,
QObject *parent)
@@ -175,6 +183,7 @@ void QLowEnergyControllerNew::disconnectFromDevice()
if (state() == QLowEnergyControllerNew::UnconnectedState)
return;
+ d->invalidateServices();
d->disconnectFromDevice();
}
@@ -185,7 +194,6 @@ void QLowEnergyControllerNew::discoverServices()
if (d->state != QLowEnergyControllerNew::ConnectedState)
return;
- d->serviceList.clear();
d->discoverServices();
}
diff --git a/src/bluetooth/qlowenergycontrollernew_bluez.cpp b/src/bluetooth/qlowenergycontrollernew_bluez.cpp
index 90b12fa1..a2a0bac2 100644
--- a/src/bluetooth/qlowenergycontrollernew_bluez.cpp
+++ b/src/bluetooth/qlowenergycontrollernew_bluez.cpp
@@ -138,6 +138,7 @@ void QLowEnergyControllerNewPrivate::l2cpErrorChanged(QBluetoothSocket::SocketEr
break;
}
+ invalidateServices();
setState(QLowEnergyControllerNew::UnconnectedState);
}
@@ -184,6 +185,7 @@ void QLowEnergyControllerNewPrivate::l2cpReadyRead()
details.endHandle = end;
QLowEnergyService *service = new QLowEnergyService(uuid);
+ service->setController(this);
QSharedPointer<QLowEnergyService> pointer(service);
details.service = pointer;
@@ -236,7 +238,7 @@ void QLowEnergyControllerNewPrivate::sendReadByGroupRequest(
void QLowEnergyControllerNewPrivate::discoverServiceDetails(const QBluetoothUuid &/*service*/)
{
-
+ //TODO Implement discoverServiceDetails()
}
diff --git a/src/bluetooth/qlowenergycontrollernew_p.cpp b/src/bluetooth/qlowenergycontrollernew_p.cpp
index b6a89ccd..f8536b4b 100644
--- a/src/bluetooth/qlowenergycontrollernew_p.cpp
+++ b/src/bluetooth/qlowenergycontrollernew_p.cpp
@@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE
void QLowEnergyControllerNewPrivate::connectToDevice()
{
-
+ setError(QLowEnergyControllerNew::UnknownError);
}
void QLowEnergyControllerNewPrivate::disconnectFromDevice()
diff --git a/src/bluetooth/qlowenergycontrollernew_p.h b/src/bluetooth/qlowenergycontrollernew_p.h
index 41824239..b5a66aeb 100644
--- a/src/bluetooth/qlowenergycontrollernew_p.h
+++ b/src/bluetooth/qlowenergycontrollernew_p.h
@@ -59,7 +59,7 @@ struct ServiceDetails {
QSharedPointer<QLowEnergyService> service;
};
-class QLowEnergyControllerNewPrivate : QObject
+class QLowEnergyControllerNewPrivate : public QObject
{
Q_OBJECT
Q_DECLARE_PUBLIC(QLowEnergyControllerNew)
@@ -82,6 +82,7 @@ public:
void disconnectFromDevice();
void discoverServices();
+ void invalidateServices();
void discoverServiceDetails(const QBluetoothUuid &);
diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp
index e60f7cc1..0e25c9b3 100644
--- a/src/bluetooth/qlowenergyservice.cpp
+++ b/src/bluetooth/qlowenergyservice.cpp
@@ -40,9 +40,12 @@
****************************************************************************/
#include <QtCore/QCoreApplication>
+#include <QtCore/QPointer>
#include <QtBluetooth/QLowEnergyService>
#include <QtBluetooth/QLowEnergyCharacteristicInfo>
+#include "qlowenergycontrollernew_p.h"
+
QT_BEGIN_NAMESPACE
class QLowEnergyServicePrivate {
@@ -50,16 +53,61 @@ public:
QBluetoothUuid uuid;
QLowEnergyService::ServiceType type;
QLowEnergyService::ServiceState state;
+ QLowEnergyService::ServiceError lastError;
+
+ QPointer<QLowEnergyControllerNewPrivate> controller;
};
+/*!
+ \internal
+
+ QLowEnergyControllerNewPrivate creates instances of this class.
+ The user gets access to class instances via
+ \l QLowEnergyControllerNew::services().
+ */
QLowEnergyService::QLowEnergyService(const QBluetoothUuid &uuid,
QObject *parent)
: QObject(parent)
{
d_ptr = new QLowEnergyServicePrivate();
d_ptr->uuid = uuid;
- d_ptr->state = QLowEnergyService::DiscoveryRequired;
+ d_ptr->state = QLowEnergyService::InvalidService;
d_ptr->type = QLowEnergyService::PrimaryService;
+ d_ptr->lastError = QLowEnergyService::NoError;
+}
+
+/*!
+ \internal
+
+ Called by Controller right after construction.
+ */
+void QLowEnergyService::setController(QLowEnergyControllerNewPrivate *control)
+{
+ Q_D(QLowEnergyService);
+ if (!control)
+ return;
+
+ d->state = QLowEnergyService::DiscoveryRequired;
+ d->controller = control;
+}
+
+/*!
+ \internal
+
+ Called by Controller.
+ */
+void QLowEnergyService::setError(QLowEnergyService::ServiceError newError)
+{
+ Q_D(QLowEnergyService);
+ d->lastError = newError;
+ emit error(newError);
+}
+
+void QLowEnergyService::setState(QLowEnergyService::ServiceState newState)
+{
+ Q_D(QLowEnergyService);
+ d->state = newState;
+ emit stateChanged(newState);
}
QLowEnergyService::~QLowEnergyService()
@@ -117,7 +165,21 @@ QString QLowEnergyService::serviceName() const
void QLowEnergyService::discoverDetails()
{
- //TODO discoverDetails
+ Q_D(QLowEnergyService);
+ if (d->state != QLowEnergyService::DiscoveryRequired)
+ return;
+
+ if (!d->controller) {
+ setError(QLowEnergyService::ServiceNotValidError);
+ return;
+ }
+
+ d->controller->discoverServiceDetails(d->uuid);
+}
+
+QLowEnergyService::ServiceError QLowEnergyService::error() const
+{
+ return d_ptr->lastError;
}
diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h
index 20ff6c9c..03505e30 100644
--- a/src/bluetooth/qlowenergyservice.h
+++ b/src/bluetooth/qlowenergyservice.h
@@ -47,6 +47,7 @@
QT_BEGIN_NAMESPACE
class QLowEnergyServicePrivate;
+class QLowEnergyControllerNewPrivate;
class Q_BLUETOOTH_EXPORT QLowEnergyService : public QObject
{
Q_OBJECT
@@ -56,6 +57,11 @@ public:
IncludedService
};
+ enum ServiceError {
+ NoError = 0,
+ ServiceNotValidError
+ };
+
enum ServiceState {
InvalidService = 0, // when underlying controller disconnects
DiscoveryRequired, // we know start/end handle but nothing more
@@ -76,22 +82,30 @@ public:
void discoverDetails();
+ ServiceError error() const;
+
+
Q_SIGNALS:
void stateChanged(QLowEnergyService::ServiceState newState);
void characteristicChanged(const QLowEnergyCharacteristicInfo &info,
const QByteArray &value);
void descriptorChanged(const QLowEnergyDescriptorInfo &info,
const QByteArray &value);
+ void error(QLowEnergyService::ServiceError error);
private:
Q_DECLARE_PRIVATE(QLowEnergyService)
QLowEnergyServicePrivate *d_ptr;
- //somehow we need to connect this to QLowEnergyControllerNew
- //which owns the communication
+ // the symbols below are used by QLowEnergyControllerNewPrivate
+ // TODO check whether there are other ways of accessing the internals
+ friend class QLowEnergyControllerNewPrivate;
+
QLowEnergyService(const QBluetoothUuid &uuid,
QObject *parent = 0);
- friend class QLowEnergyControllerNewPrivate;
+ void setController(QLowEnergyControllerNewPrivate* control);
+ void setError(QLowEnergyService::ServiceError newError);
+ void setState(QLowEnergyService::ServiceState newState);
};
QT_END_NAMESPACE