diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-10-29 13:04:49 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@digia.com> | 2014-11-04 09:47:24 +0100 |
commit | 7c12e73031c7dde3d422f9a2d0baeaa25b75fabb (patch) | |
tree | fcc6a333174cb741bc459855778ae0917e8f2cdc /src/bluetooth/qlowenergycontroller_android.cpp | |
parent | cb3054e2373dec8e800c1b5208555936ef3ae63b (diff) |
Android: Add ability to (dis)connect to BTLE devices on Android
and keep tracking the connection state
Change-Id: If4d05fa18c78802ae06096884fba78eed123e77f
Reviewed-by: Timur Pocheptsov <Timur.Pocheptsov@digia.com>
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src/bluetooth/qlowenergycontroller_android.cpp')
-rw-r--r-- | src/bluetooth/qlowenergycontroller_android.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp new file mode 100644 index 00000000..77cdb12a --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** 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. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qlowenergycontroller_p.h" +#include <QtCore/QLoggingCategory> +#include <QtAndroidExtras/QAndroidJniEnvironment> + +QT_BEGIN_NAMESPACE + +Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) + +QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() + : QObject(), + state(QLowEnergyController::UnconnectedState), + error(QLowEnergyController::NoError), + hub(0) +{ +} + +QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() +{ +} + +void QLowEnergyControllerPrivate::connectToDevice() +{ + // required to pass unit test on default backend + if (remoteDevice.isNull()) { + qWarning() << "Invalid/null remote device address"; + setError(QLowEnergyController::UnknownRemoteDeviceError); + return; + } + + setState(QLowEnergyController::ConnectingState); + + if (!hub) { + hub = new LowEnergyNotificationHub(remoteDevice, this); + connect(hub, &LowEnergyNotificationHub::connectionUpdated, + this, &QLowEnergyControllerPrivate::connectionUpdated); + } + + if (!hub->javaObject().isValid()) { + qCWarning(QT_BT_ANDROID) << "Cannot initiate QtBluetoothLE"; + setError(QLowEnergyController::UnknownError); + setState(QLowEnergyController::UnconnectedState); + return; + } + + bool result = hub->javaObject().callMethod<jboolean>("connect"); + if (!result) { + setError(QLowEnergyController::UnknownError); + setState(QLowEnergyController::UnconnectedState); + return; + } +} + +void QLowEnergyControllerPrivate::disconnectFromDevice() +{ + setState(QLowEnergyController::ClosingState); + + hub->javaObject().callMethod<void>("disconnect"); +} + +void QLowEnergyControllerPrivate::discoverServices() +{ + +} + +void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &/*service*/) +{ + +} + +void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer<QLowEnergyServicePrivate> /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QByteArray &/*newValue*/, + bool /*writeWithResponse*/) +{ + +} + +void QLowEnergyControllerPrivate::writeDescriptor( + const QSharedPointer<QLowEnergyServicePrivate> /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/, + const QByteArray &/*newValue*/) +{ + +} + +void QLowEnergyControllerPrivate::connectionUpdated( + QLowEnergyController::ControllerState newState, + QLowEnergyController::Error errorCode) +{ + Q_Q(QLowEnergyController); + + qCDebug(QT_BT_ANDROID) << "Connection updated" << errorCode << newState; + if (errorCode != QLowEnergyController::NoError) + setError(errorCode); + + QLowEnergyController::ControllerState oldState = state; + setState(newState); + if (newState == QLowEnergyController::UnconnectedState + && oldState != QLowEnergyController::UnconnectedState) { + emit q->disconnected(); + } else if (newState == QLowEnergyController::ConnectedState + && oldState != QLowEnergyController::ConnectedState ) { + emit q->connected(); + } +} + +QT_END_NAMESPACE |