diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bluetooth/bluetooth.pro | 2 | ||||
-rw-r--r-- | src/bluetooth/qbluetoothuuid.h | 1 | ||||
-rw-r--r-- | src/bluetooth/qlowenergycharacteristic.cpp | 34 | ||||
-rw-r--r-- | src/bluetooth/qlowenergycharacteristic.h | 4 | ||||
-rw-r--r-- | src/bluetooth/qlowenergycontrollernew_bluez.cpp | 15 | ||||
-rw-r--r-- | src/bluetooth/qlowenergydescriptor.cpp | 254 | ||||
-rw-r--r-- | src/bluetooth/qlowenergydescriptor.h | 91 | ||||
-rw-r--r-- | src/bluetooth/qlowenergyservice.h | 2 | ||||
-rw-r--r-- | src/bluetooth/qlowenergyserviceprivate_p.h | 7 |
9 files changed, 392 insertions, 18 deletions
diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 6405ad02..6b015229 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -28,6 +28,7 @@ PUBLIC_HEADERS += \ qlowenergycharacteristicinfo.h \ qlowenergycharacteristic.h \ qlowenergydescriptorinfo.h \ + qlowenergydescriptor.h \ qbluetoothtransferreply.h \ qlowenergycontroller.h \ qlowenergycontrollernew.h @@ -73,6 +74,7 @@ SOURCES += \ qlowenergycharacteristicinfo.cpp \ qlowenergycharacteristic.cpp \ qlowenergydescriptorinfo.cpp \ + qlowenergydescriptor.cpp \ qlowenergycontroller.cpp \ qlowenergycontrollernew.cpp \ qlowenergyserviceprivate.cpp diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index 66be1b18..274e98ab 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -261,6 +261,7 @@ public: }; enum DescriptorType { + UnknownDescriptorType = 0x0, CharacteristicExtendedProperties = 0x2900, CharacteristicUserDescription = 0x2901, ClientCharacteristicConfiguration = 0x2902, diff --git a/src/bluetooth/qlowenergycharacteristic.cpp b/src/bluetooth/qlowenergycharacteristic.cpp index 10136c10..f74aa808 100644 --- a/src/bluetooth/qlowenergycharacteristic.cpp +++ b/src/bluetooth/qlowenergycharacteristic.cpp @@ -219,9 +219,16 @@ QLowEnergyCharacteristic &QLowEnergyCharacteristic::operator=(const QLowEnergyCh } /*! - Returns true if the QLowEnergyCharacteristic object is valid, otherwise returns false. - If it returns \c false, it means that this instance is not associated to any service - or the associated service is no longer valid. + Returns \c true if the QLowEnergyCharacteristic object is valid, otherwise returns \c false. + + An invalid characteristic object is not associated to any service + or the associated service is no longer valid due to for example a disconnect from + the underlying Bluetooth Low Energy device. Once the object is invalid + it cannot become valid anymore. + + \note If a QLowEnergyCharacteristic instance turns invalid due to a disconnect + from the underlying device, the information encapsulated by the current + instance remains as it was at the time of the disconnect. */ bool QLowEnergyCharacteristic::isValid() const { @@ -239,12 +246,25 @@ bool QLowEnergyCharacteristic::isValid() const /*! Returns the list of characteristic descriptors. */ -QList<QLowEnergyDescriptorInfo> QLowEnergyCharacteristic::descriptors() const +QList<QLowEnergyDescriptor> QLowEnergyCharacteristic::descriptors() const { - // TODO QLowEnergyCharacteristic::descriptors() - QList<QLowEnergyDescriptorInfo> result; - return result; + QList<QLowEnergyDescriptor> result; + + if (d_ptr.isNull() || !data + || !d_ptr->characteristicList.contains(data->handle)) + return result; + QList<QLowEnergyHandle> descriptorKeys = d_ptr->characteristicList[data->handle]. + descriptorList.keys(); + + std::sort(descriptorKeys.begin(), descriptorKeys.end()); + + foreach (QLowEnergyHandle descHandle, descriptorKeys) { + QLowEnergyDescriptor descriptor(d_ptr, data->handle, descHandle); + result.append(descriptor); + } + + return result; } QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index 6454ef67..4478b910 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -46,7 +46,7 @@ #include <QtCore/QObject> #include <QtBluetooth/qbluetooth.h> #include <QtBluetooth/QBluetoothUuid> -#include <QtBluetooth/QLowEnergyDescriptorInfo> +#include <QtBluetooth/QLowEnergyDescriptor> QT_BEGIN_NAMESPACE @@ -86,7 +86,7 @@ public: QLowEnergyCharacteristic::PropertyTypes properties() const; QLowEnergyHandle handle() const; - QList<QLowEnergyDescriptorInfo> descriptors() const; + QList<QLowEnergyDescriptor> descriptors() const; bool isValid() const; diff --git a/src/bluetooth/qlowenergycontrollernew_bluez.cpp b/src/bluetooth/qlowenergycontrollernew_bluez.cpp index 4e5f5270..3ddbfd5c 100644 --- a/src/bluetooth/qlowenergycontrollernew_bluez.cpp +++ b/src/bluetooth/qlowenergycontrollernew_bluez.cpp @@ -420,11 +420,6 @@ void QLowEnergyControllerNewPrivate::processReply( * The uuid can be 16 or 128 bit which is indicated by format. */ - if (isErrorResponse) { - //TODO handle error - break; - } - QList<QLowEnergyHandle> keys = request.reference.value<QList<QLowEnergyHandle> >(); if (keys.isEmpty()) { qCWarning(QT_BT_BLUEZ) << "Descriptor discovery for unknown characteristic received"; @@ -436,6 +431,10 @@ void QLowEnergyControllerNewPrivate::processReply( serviceForHandle(charHandle); Q_ASSERT(!p.isNull()); + if (isErrorResponse) { + p->setState(QLowEnergyService::ServiceDiscovered); + break; + } const quint8 format = response[1]; quint16 elementLength; @@ -479,12 +478,14 @@ void QLowEnergyControllerNewPrivate::processReply( if (descriptorHandle == p->characteristicList[charHandle].valueHandle) continue; + QLowEnergyServicePrivate::DescData data; + data.uuid = uuid; p->characteristicList[charHandle].descriptorList.insert( - descriptorHandle, uuid); + descriptorHandle, data); qCDebug(QT_BT_BLUEZ) << "Descriptor found, uuid:" << uuid.toString() - << "descriptor handle:" << descriptorHandle; + << "descriptor handle:" << hex << descriptorHandle; } QLowEnergyHandle nextBorderHandle = 0; diff --git a/src/bluetooth/qlowenergydescriptor.cpp b/src/bluetooth/qlowenergydescriptor.cpp new file mode 100644 index 00000000..5987d91d --- /dev/null +++ b/src/bluetooth/qlowenergydescriptor.cpp @@ -0,0 +1,254 @@ +/*************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtBluetooth/QLowEnergyService> +#include "qlowenergyserviceprivate_p.h" +#include "qlowenergydescriptor.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QLowEnergyDescriptor + \inmodule QtBluetooth + \brief The QLowEnergyDescriptor class stores information about the Bluetooth + Low Energy descriptor. + \since 5.4 + + QLowEnergyDescriptor provides information about a Bluetooth Low Energy + descriptor's name, UUID, value and handle. Descriptors are contained in the + Bluetooth Low Energy characteristic and they provide additional information + about the characteristic (data format, notification activation, etc). +*/ + +struct QLowEnergyDescriptorPrivate +{ + QLowEnergyHandle charHandle; + QLowEnergyHandle descHandle; +}; + +/*! + Destroys the QLowEnergyDescriptor object. +*/ +QLowEnergyDescriptor::QLowEnergyDescriptor(): + d_ptr(0), data(0) +{ +} + +/*! + Construct a new QLowEnergyDesxcriptor that is a copy of \a other. + + The two copies continue to share the same underlying data which does not detach + upon write. +*/ +QLowEnergyDescriptor::QLowEnergyDescriptor(const QLowEnergyDescriptor &other): + d_ptr(other.d_ptr), data(0) +{ + if (other.data) { + data = new QLowEnergyDescriptorPrivate(); + data->charHandle = other.data->charHandle; + data->descHandle = other.data->descHandle; + } +} + +/*! + \internal + +*/ +QLowEnergyDescriptor::QLowEnergyDescriptor(QSharedPointer<QLowEnergyServicePrivate> p, + QLowEnergyHandle charHandle, + QLowEnergyHandle descHandle): + d_ptr(p) +{ + data = new QLowEnergyDescriptorPrivate(); + data->charHandle = charHandle; + data->descHandle = descHandle; + +} + +/*! + Destroys the QLowEnergyDescriptor object. +*/ +QLowEnergyDescriptor::~QLowEnergyDescriptor() +{ + delete data; +} + +/*! + Makes a copy of \a other and assigns it to this QLowEnergyDescriptor object. + The two copies continue to share the same service and registration details. +*/ +QLowEnergyDescriptor &QLowEnergyDescriptor::operator=(const QLowEnergyDescriptor &other) +{ + d_ptr = other.d_ptr; + + if (!other.data) { + if (data) { + delete data; + data = 0; + } + } else { + if (!data) + data = new QLowEnergyDescriptorPrivate(); + + data->charHandle = other.data->charHandle; + data->descHandle = other.data->descHandle; + } + + return *this; +} + +/*! + Returns \c true if the QLowEnergyDescriptor object is valid, otherwise returns \c false. + + An invalid descriptor instance is not associated to any service + or the associated service is no longer valid due to for example a disconnect from + the underlying Bluetooth Low Energy device. Once the object is invalid + it cannot become valid anymore. + + \note If a QLowEnergyDescriptor instance turns invalid due to a disconnect + from the underlying device, the information encapsulated by the current + instance remains as it was at the time of the disconnect. +*/ +bool QLowEnergyDescriptor::isValid() const +{ + if (d_ptr.isNull() || !data) + return false; + + if (d_ptr->state == QLowEnergyService::InvalidService) + return false; + + return true; +} + +/*! + Returns the UUID of this descriptor. +*/ +QBluetoothUuid QLowEnergyDescriptor::uuid() const +{ + if (d_ptr.isNull() || !data + || !d_ptr->characteristicList.contains(data->charHandle) + || !d_ptr->characteristicList[data->charHandle]. + descriptorList.contains(data->descHandle)) + return QBluetoothUuid::UnknownDescriptorType; + + return d_ptr->characteristicList[data->charHandle].descriptorList[data->descHandle].uuid; +} + +/*! + Returns the handle of the descriptor. +*/ +QLowEnergyHandle QLowEnergyDescriptor::handle() const +{ + if (!data) + return 0; + + return data->descHandle; +} + +/*! + Returns the value of the descriptor. +*/ +QByteArray QLowEnergyDescriptor::value() const +{ + if (d_ptr.isNull() || !data + || !d_ptr->characteristicList.contains(data->charHandle) + || !d_ptr->characteristicList[data->charHandle]. + descriptorList.contains(data->descHandle)) + return QByteArray(); + + return d_ptr->characteristicList[data->charHandle].descriptorList[data->descHandle].value; +} + +/*! + Returns the name of the descriptor type. + + \sa type() +*/ + +QString QLowEnergyDescriptor::name() const +{ + return QBluetoothUuid::descriptorToString(type()); +} + +/*! + Returns the type of descriptor. + */ +QBluetoothUuid::DescriptorType QLowEnergyDescriptor::type() const +{ + const QBluetoothUuid u = uuid(); + bool ok = false; + quint16 shortUuid = u.toUInt16(&ok); + + if (!ok) + return QBluetoothUuid::UnknownDescriptorType; + + switch (shortUuid) { + case QBluetoothUuid::CharacteristicExtendedProperties: + case QBluetoothUuid::CharacteristicUserDescription: + case QBluetoothUuid::ClientCharacteristicConfiguration: + case QBluetoothUuid::ServerCharacteristicConfiguration: + case QBluetoothUuid::CharacteristicPresentationFormat: + case QBluetoothUuid::CharacteristicAggregateFormat: + case QBluetoothUuid::ValidRange: + case QBluetoothUuid::ExternalReportReference: + case QBluetoothUuid::ReportReference: + return (QBluetoothUuid::DescriptorType) shortUuid; + default: + break; + } + + return QBluetoothUuid::UnknownDescriptorType; +} + +/*! + Sets the value \a value of the descriptor. This only caches the value. To write + a value directly to the device QLowEnergyController class must be used. + + \sa QLowEnergyController::writeDescriptor() +*/ +void QLowEnergyDescriptor::setValue(const QByteArray &value) +{ + //TODO + //d_ptr->m_value = value; +} + +QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h new file mode 100644 index 00000000..a3da83c4 --- /dev/null +++ b/src/bluetooth/qlowenergydescriptor.h @@ -0,0 +1,91 @@ +/*************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOWENERGYDESCRIPTOR_H +#define QLOWENERGYDESCRIPTOR_H + +#include <QtCore/QSharedPointer> +#include <QtCore/QVariantMap> +#include <QtBluetooth/qbluetooth.h> +#include <QtBluetooth/QBluetoothUuid> + +QT_BEGIN_NAMESPACE + +class QLowEnergyDescriptorPrivate; +class QLowEnergyServicePrivate; + +//TODO rename to QLowEnergyDescriptor +class Q_BLUETOOTH_EXPORT QLowEnergyDescriptor +{ + friend class QLowEnergyControllerPrivate; +public: + QLowEnergyDescriptor(); + QLowEnergyDescriptor(const QLowEnergyDescriptor &other); + ~QLowEnergyDescriptor(); + + QLowEnergyDescriptor &operator=(const QLowEnergyDescriptor &other); + + bool isValid() const; + + QByteArray value() const; + void setValue(const QByteArray &value); //TODO shift to QLowEnergyControllerNew + + QBluetoothUuid uuid() const; + QLowEnergyHandle handle() const; + QString name() const; + + QBluetoothUuid::DescriptorType type() const; + +protected: + QSharedPointer<QLowEnergyServicePrivate> d_ptr; + + friend class QLowEnergyCharacteristic; + QLowEnergyDescriptorPrivate *data; + + QLowEnergyDescriptor(QSharedPointer<QLowEnergyServicePrivate> p, + QLowEnergyHandle charHandle, + QLowEnergyHandle descHandle); +}; + +QT_END_NAMESPACE + +#endif // QLOWENERGYDESCRIPTOR_H diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index c2ecc6b0..9c53aea7 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -90,7 +90,7 @@ Q_SIGNALS: void stateChanged(QLowEnergyService::ServiceState newState); void characteristicChanged(const QLowEnergyCharacteristic &info, const QByteArray &value); - void descriptorChanged(const QLowEnergyDescriptorInfo &info, + void descriptorChanged(const QLowEnergyDescriptor &info, const QByteArray &value); void error(QLowEnergyService::ServiceError error); diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h index 16b1ea31..72caeeac 100644 --- a/src/bluetooth/qlowenergyserviceprivate_p.h +++ b/src/bluetooth/qlowenergyserviceprivate_p.h @@ -59,12 +59,17 @@ public: explicit QLowEnergyServicePrivate(QObject *parent = 0); ~QLowEnergyServicePrivate(); + struct DescData { + QByteArray value; + QBluetoothUuid uuid; + }; + struct CharData { QLowEnergyHandle valueHandle; QBluetoothUuid uuid; QLowEnergyCharacteristic::PropertyTypes properties; QByteArray value; - QHash<QLowEnergyHandle, QBluetoothUuid> descriptorList; + QHash<QLowEnergyHandle, DescData> descriptorList; }; enum GattAttributeTypes { |