Commit 0c5b5e5c32582d72dfa85248de4f8a9d00be1601
0 parents
Initial commit. dependencies not resolved yet.
Showing
15 changed files
with
1117 additions
and
0 deletions
.gitignore
0 → 100644
CMakeLists.txt
0 → 100644
| 1 | +++ a/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | + | ||
| 3 | +# Check to see where cmake is located. | ||
| 4 | +if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) | ||
| 5 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) | ||
| 6 | +elseif( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../cmake ) | ||
| 7 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) | ||
| 8 | +else() | ||
| 9 | + return() | ||
| 10 | +endif() | ||
| 11 | + | ||
| 12 | +# Check to see if there is versioning information available | ||
| 13 | +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake) | ||
| 14 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake) | ||
| 15 | + include(osdevversion) | ||
| 16 | +endif() | ||
| 17 | + | ||
| 18 | +include(projectheader) | ||
| 19 | +project_header(osdev_qt-bluetooth) | ||
| 20 | + | ||
| 21 | +add_subdirectory(src) | ||
| 22 | +add_subdirectory(tests) | ||
| 23 | + | ||
| 24 | +# include(packaging) | ||
| 25 | +# package_component() |
README.md
0 → 100644
| 1 | +++ a/README.md |
src/CMakeLists.txt
0 → 100644
| 1 | +++ a/src/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../cmake) | ||
| 3 | +include(projectheader) | ||
| 4 | +project_header(bluetooth) | ||
| 5 | + | ||
| 6 | +find_package( Qt5Core REQUIRED ) | ||
| 7 | +find_package( Qt5Bluetooth REQUIRED ) | ||
| 8 | + | ||
| 9 | +include_directories( SYSTEM | ||
| 10 | + ${Qt5Core_INCLUDE_DIRS} | ||
| 11 | + ${Qt5Bluetooth_INCLUDE_DIRS} | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +include(compiler) | ||
| 15 | + | ||
| 16 | +include_directories( | ||
| 17 | + ${CMAKE_CURRENT_SOURCE_DIR}/../logutils | ||
| 18 | +) | ||
| 19 | + | ||
| 20 | +set(SRC_LIST | ||
| 21 | + ${CMAKE_CURRENT_SOURCE_DIR}/bluetoothbaseclass.cpp | ||
| 22 | + ${CMAKE_CURRENT_SOURCE_DIR}/connectionhandler.cpp | ||
| 23 | + ${CMAKE_CURRENT_SOURCE_DIR}/devicefinder.cpp | ||
| 24 | + ${CMAKE_CURRENT_SOURCE_DIR}/devicehandler.cpp | ||
| 25 | + ${CMAKE_CURRENT_SOURCE_DIR}/deviceinfo.cpp | ||
| 26 | +) | ||
| 27 | + | ||
| 28 | +include(qtmoc) | ||
| 29 | +create_mocs( SRC_LIST MOC_LIST | ||
| 30 | + ${CMAKE_CURRENT_SOURCE_DIR}/bluetoothbaseclass.h | ||
| 31 | + ${CMAKE_CURRENT_SOURCE_DIR}/connectionhandler.h | ||
| 32 | + ${CMAKE_CURRENT_SOURCE_DIR}/devicefinder.h | ||
| 33 | + ${CMAKE_CURRENT_SOURCE_DIR}/devicehandler.h | ||
| 34 | + ${CMAKE_CURRENT_SOURCE_DIR}/deviceinfo.h | ||
| 35 | +) | ||
| 36 | + | ||
| 37 | +link_directories( | ||
| 38 | + ${CMAKE_BINARY_DIR}/lib | ||
| 39 | +) | ||
| 40 | + | ||
| 41 | +include(library) | ||
| 42 | +add_libraries( | ||
| 43 | + ${Qt5Core_LIBRARIES} | ||
| 44 | + ${Qt5Bluetooth_LIBRARIES} | ||
| 45 | + logutils | ||
| 46 | +) | ||
| 47 | + | ||
| 48 | +include(installation) | ||
| 49 | +install_component() |
src/bluetoothbaseclass.cpp
0 → 100644
| 1 | +++ a/src/bluetoothbaseclass.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +// Qt | ||
| 23 | +#include <QDebug> | ||
| 24 | + | ||
| 25 | +// osdev::components::bluetooth | ||
| 26 | +#include "bluetoothbaseclass.h" | ||
| 27 | + | ||
| 28 | +using namespace osdev::components::bluetooth; | ||
| 29 | + | ||
| 30 | +BluetoothBaseClass::BluetoothBaseClass( QObject *parent ) | ||
| 31 | + : QObject( parent ) | ||
| 32 | + , m_error() | ||
| 33 | + , m_info() | ||
| 34 | +{ | ||
| 35 | + | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +QString BluetoothBaseClass::error() const | ||
| 39 | +{ | ||
| 40 | + return m_error; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +void BluetoothBaseClass::setError( const QString &error ) | ||
| 44 | +{ | ||
| 45 | + if( m_error != error ) | ||
| 46 | + { | ||
| 47 | + m_error = error; | ||
| 48 | + qInfo() << m_error; | ||
| 49 | + emit signalErrorChanged(); | ||
| 50 | + } | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +QString BluetoothBaseClass::info() const | ||
| 54 | +{ | ||
| 55 | + return m_info; | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +void BluetoothBaseClass::setInfo( const QString &info ) | ||
| 59 | +{ | ||
| 60 | + if( m_info != info ) | ||
| 61 | + { | ||
| 62 | + m_info = info; | ||
| 63 | + qInfo() << m_info; | ||
| 64 | + emit signalInfoChanged(); | ||
| 65 | + } | ||
| 66 | +} | ||
| 67 | + | ||
| 68 | +void BluetoothBaseClass::clearMessages() | ||
| 69 | +{ | ||
| 70 | + setInfo( "" ); | ||
| 71 | + setError( "" ); | ||
| 72 | +} |
src/bluetoothbaseclass.h
0 → 100644
| 1 | +++ a/src/bluetoothbaseclass.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_BLUETOOTH_BLUETOOTHBASECLASS_H | ||
| 23 | +#define OSDEV_COMPONENTS_BLUETOOTH_BLUETOOTHBASECLASS_H | ||
| 24 | + | ||
| 25 | +#include <QObject> | ||
| 26 | + | ||
| 27 | +namespace osdev { | ||
| 28 | +namespace components { | ||
| 29 | +namespace bluetooth { | ||
| 30 | + | ||
| 31 | +class BluetoothBaseClass : public QObject | ||
| 32 | +{ | ||
| 33 | + Q_OBJECT | ||
| 34 | + | ||
| 35 | +public: | ||
| 36 | + explicit BluetoothBaseClass( QObject *parent = nullptr ); | ||
| 37 | + | ||
| 38 | + QString error() const; | ||
| 39 | + void setError( const QString &error ); | ||
| 40 | + | ||
| 41 | + QString info() const; | ||
| 42 | + void setInfo( const QString &info ); | ||
| 43 | + | ||
| 44 | + void clearMessages(); | ||
| 45 | + | ||
| 46 | +signals: | ||
| 47 | + void signalErrorChanged(); | ||
| 48 | + void signalInfoChanged(); | ||
| 49 | + | ||
| 50 | +private: | ||
| 51 | + QString m_error; | ||
| 52 | + QString m_info; | ||
| 53 | + | ||
| 54 | +}; | ||
| 55 | + | ||
| 56 | +} /* End namespace bluetooth */ | ||
| 57 | +} /* End namespace components */ | ||
| 58 | +} /* End namespace osdev */ | ||
| 59 | + | ||
| 60 | +#endif /* OSDEV_COMPONENTS_BLUETOOTH_BLUETOOTHBASECLASS_H */ |
src/connectionhandler.cpp
0 → 100644
| 1 | +++ a/src/connectionhandler.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +// osdev::components::bluetooth | ||
| 23 | +#include "connectionhandler.h" | ||
| 24 | +//Qt | ||
| 25 | +#include <QtBluetooth/qtbluetooth-config.h> | ||
| 26 | +#include <QtCore/qsystemdetection.h> | ||
| 27 | + | ||
| 28 | +using namespace osdev::components::bluetooth; | ||
| 29 | + | ||
| 30 | +ConnectionHandler::ConnectionHandler( QObject *parent ) | ||
| 31 | + : QObject( parent ) | ||
| 32 | + , m_localDevice() | ||
| 33 | +{ | ||
| 34 | + connect( &m_localDevice, &QBluetoothLocalDevice::hostModeStateChanged, this, &ConnectionHandler::slotHostModeChanged ); | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +bool ConnectionHandler::alive() const | ||
| 38 | +{ | ||
| 39 | + // Bit hacky but basically just a large 'AND' statement. | ||
| 40 | + return m_localDevice.isValid() && m_localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +bool ConnectionHandler::requiresAddressType() const | ||
| 44 | +{ | ||
| 45 | +#if QT_CONFIG( bluez ) | ||
| 46 | + return true; | ||
| 47 | +#else | ||
| 48 | + return false; | ||
| 49 | +#endif | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +QString ConnectionHandler::name() const | ||
| 53 | +{ | ||
| 54 | + return m_localDevice.name(); | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +QString ConnectionHandler::address() const | ||
| 58 | +{ | ||
| 59 | + return m_localDevice.address().toString(); | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +void ConnectionHandler::slotHostModeChanged( QBluetoothLocalDevice::HostMode /* mode */ ) | ||
| 63 | +{ | ||
| 64 | + emit signalDeviceChanged(); | ||
| 65 | +} |
src/connectionhandler.h
0 → 100644
| 1 | +++ a/src/connectionhandler.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_BLUETOOTH_CONNECTIONHANDLER_H | ||
| 23 | +#define OSDEV_COMPONENTS_BLUETOOTH_CONNECTIONHANDLER_H | ||
| 24 | + | ||
| 25 | +// Qt | ||
| 26 | +#include <QObject> | ||
| 27 | +#include <QBluetoothLocalDevice> | ||
| 28 | + | ||
| 29 | +namespace osdev { | ||
| 30 | +namespace components { | ||
| 31 | +namespace bluetooth { | ||
| 32 | + | ||
| 33 | +class ConnectionHandler : public QObject | ||
| 34 | +{ | ||
| 35 | + Q_OBJECT | ||
| 36 | + | ||
| 37 | +public: | ||
| 38 | + explicit ConnectionHandler( QObject *parent = nullptr ); | ||
| 39 | + | ||
| 40 | + bool alive() const; | ||
| 41 | + bool requiresAddressType() const; | ||
| 42 | + QString name() const; | ||
| 43 | + QString address() const; | ||
| 44 | + | ||
| 45 | +signals: | ||
| 46 | + void signalDeviceChanged(); | ||
| 47 | + | ||
| 48 | +private slots: | ||
| 49 | + void slotHostModeChanged( QBluetoothLocalDevice::HostMode mode ); | ||
| 50 | + | ||
| 51 | +private: | ||
| 52 | + QBluetoothLocalDevice m_localDevice; | ||
| 53 | +}; | ||
| 54 | + | ||
| 55 | +} /* End namespace bluetooth */ | ||
| 56 | +} /* End namespace components */ | ||
| 57 | +} /* End namespace osdev */ | ||
| 58 | + | ||
| 59 | +#endif /* OSDEV_COMPONENTS_BLUETOOTH_CONNECTIONHANDLER_H */ |
src/devicefinder.cpp
0 → 100644
| 1 | +++ a/src/devicefinder.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +// osdev::components::bluetooth | ||
| 23 | +#include "devicefinder.h" | ||
| 24 | +#include "devicehandler.h" | ||
| 25 | +#include "deviceinfo.h" | ||
| 26 | + | ||
| 27 | +using namespace osdev::components::bluetooth; | ||
| 28 | + | ||
| 29 | +DeviceFinder::DeviceFinder( DeviceHandler *handler, QObject *parent ) | ||
| 30 | + : BluetoothBaseClass( parent ) | ||
| 31 | + , m_pDeviceHandler( handler ) | ||
| 32 | + , m_pDeviceDiscoveryAgent( new QBluetoothDeviceDiscoveryAgent() ) | ||
| 33 | + , m_devices() | ||
| 34 | +{ | ||
| 35 | + //! [devicediscovery-1] | ||
| 36 | + m_pDeviceDiscoveryAgent->setLowEnergyDiscoveryTimeout( 5000 ); | ||
| 37 | + | ||
| 38 | + connect( m_pDeviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &DeviceFinder::slotAddDevice ); | ||
| 39 | + connect( m_pDeviceDiscoveryAgent, static_cast<void (QBluetoothDeviceDiscoveryAgent::*) | ||
| 40 | + (QBluetoothDeviceDiscoveryAgent::Error)>(&QBluetoothDeviceDiscoveryAgent::error), this, &DeviceFinder::slotScanError ); | ||
| 41 | + connect( m_pDeviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &DeviceFinder::slotScanFinished ); | ||
| 42 | + connect( m_pDeviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::canceled, this, &DeviceFinder::slotScanFinished ); | ||
| 43 | + | ||
| 44 | + connect( m_pDeviceHandler, &DeviceHandler::signalReceivedValue, this, &DeviceFinder::signalSendData ); | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +DeviceFinder::~DeviceFinder() | ||
| 48 | +{ | ||
| 49 | + qDeleteAll( m_devices ); | ||
| 50 | + m_devices.clear(); | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +void DeviceFinder::slotStartSearch() | ||
| 54 | +{ | ||
| 55 | + clearMessages(); | ||
| 56 | + m_pDeviceHandler->setDevice( nullptr ); | ||
| 57 | + qDeleteAll( m_devices ); | ||
| 58 | + m_devices.clear(); | ||
| 59 | + | ||
| 60 | + emit signalDevicesChanged(); | ||
| 61 | + | ||
| 62 | + m_pDeviceDiscoveryAgent->start( QBluetoothDeviceDiscoveryAgent::LowEnergyMethod ); | ||
| 63 | + | ||
| 64 | + emit signalScanningChanged(); | ||
| 65 | + setInfo( tr( "Scanning for devices..." ) ); | ||
| 66 | +} | ||
| 67 | + | ||
| 68 | +void DeviceFinder::slotAddDevice( const QBluetoothDeviceInfo &device ) | ||
| 69 | +{ | ||
| 70 | + // If device is LowEnergy-device and its services contain the one we're looking for, add it to the list. | ||
| 71 | + if( device.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration ) | ||
| 72 | + { | ||
| 73 | + qInfo() << device.serviceUuids() << " : Looking for : " << m_pDeviceHandler->requestedServiceUuid(); | ||
| 74 | + | ||
| 75 | + m_devices.append( new DeviceInfo( device ) ); | ||
| 76 | + setInfo( tr( "Low Energy Device Found. Scanning for more...." ) ); | ||
| 77 | + emit signalDevicesChanged(); | ||
| 78 | + } | ||
| 79 | +} | ||
| 80 | + | ||
| 81 | +void DeviceFinder::slotScanError( QBluetoothDeviceDiscoveryAgent::Error error ) | ||
| 82 | +{ | ||
| 83 | + if( error == QBluetoothDeviceDiscoveryAgent::PoweredOffError ) | ||
| 84 | + { | ||
| 85 | + setError( tr( "The Bluetooth adapter is powered off." ) ); | ||
| 86 | + } | ||
| 87 | + else if( error == QBluetoothDeviceDiscoveryAgent::InputOutputError ) | ||
| 88 | + { | ||
| 89 | + setError( tr( "Writing or reading from the device resulted in an error." ) ); | ||
| 90 | + } | ||
| 91 | + else | ||
| 92 | + { | ||
| 93 | + setError( tr( "An unknown error has occured." ) ); | ||
| 94 | + } | ||
| 95 | +} | ||
| 96 | + | ||
| 97 | +void DeviceFinder::slotScanFinished() | ||
| 98 | +{ | ||
| 99 | + if( m_devices.isEmpty() ) | ||
| 100 | + setError( tr( "No Low Energy devices found." ) ); | ||
| 101 | + else | ||
| 102 | + setInfo( tr( "Scanning done." ) ); | ||
| 103 | + | ||
| 104 | + emit signalScanningChanged(); | ||
| 105 | + emit signalDevicesChanged(); | ||
| 106 | + emit signalScanFinished(); | ||
| 107 | +} | ||
| 108 | + | ||
| 109 | +void DeviceFinder::slotConnectToService( const QString &address ) | ||
| 110 | +{ | ||
| 111 | + m_pDeviceDiscoveryAgent->stop(); | ||
| 112 | + | ||
| 113 | + DeviceInfo *currentDevice = nullptr; | ||
| 114 | + for( auto entry : qAsConst( m_devices ) ) | ||
| 115 | + { | ||
| 116 | + if( entry && entry->getAddress() == address ) | ||
| 117 | + { | ||
| 118 | + currentDevice = entry; | ||
| 119 | + break; | ||
| 120 | + } | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + if( currentDevice ) | ||
| 124 | + m_pDeviceHandler->setDevice( currentDevice ); | ||
| 125 | + | ||
| 126 | + clearMessages(); | ||
| 127 | +} | ||
| 128 | + | ||
| 129 | +bool DeviceFinder::scanning() const | ||
| 130 | +{ | ||
| 131 | + return m_pDeviceDiscoveryAgent->isActive(); | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +QList<DeviceInfo*> DeviceFinder::devices() | ||
| 135 | +{ | ||
| 136 | + return m_devices; | ||
| 137 | +} | ||
| 138 | + | ||
| 139 | +QString DeviceFinder::getAddressByName( const QString &name ) | ||
| 140 | +{ | ||
| 141 | + if( name.isEmpty() || name.isNull() ) | ||
| 142 | + return QString(); | ||
| 143 | + | ||
| 144 | + for( const auto &device : qAsConst( m_devices ) ) | ||
| 145 | + { | ||
| 146 | + if( device->getName() == name ) | ||
| 147 | + return device->getAddress(); | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + return QString(); | ||
| 151 | +} | ||
| 152 | + | ||
| 153 | +void DeviceFinder::slotDisconnect() | ||
| 154 | +{ | ||
| 155 | + m_pDeviceHandler->slotDisconnectService(); | ||
| 156 | +} |
src/devicefinder.h
0 → 100644
| 1 | +++ a/src/devicefinder.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_BLUETOOTH_DEVICEFINDER_H | ||
| 23 | +#define OSDEV_COMPONENTS_BLUETOOTH_DEVICEFINDER_H | ||
| 24 | + | ||
| 25 | +// osdev::components::bluetooh | ||
| 26 | +#include "bluetoothbaseclass.h" | ||
| 27 | +#include "deviceinfo.h" | ||
| 28 | +#include "devicehandler.h" | ||
| 29 | +//Qt | ||
| 30 | +#include <QTimer> | ||
| 31 | +#include <QVariant> | ||
| 32 | +#include <QBluetoothDeviceDiscoveryAgent> | ||
| 33 | +#include <QBluetoothDeviceInfo> | ||
| 34 | + | ||
| 35 | +namespace osdev { | ||
| 36 | +namespace components { | ||
| 37 | +namespace bluetooth { | ||
| 38 | + | ||
| 39 | +class DeviceFinder : public BluetoothBaseClass | ||
| 40 | +{ | ||
| 41 | + Q_OBJECT | ||
| 42 | + | ||
| 43 | +public: | ||
| 44 | + DeviceFinder( DeviceHandler *handler, QObject *parent = nullptr ); | ||
| 45 | + ~DeviceFinder(); | ||
| 46 | + | ||
| 47 | + /// Deleted copy-constructor | ||
| 48 | + DeviceFinder( const DeviceFinder& ) = delete; | ||
| 49 | + /// Deleted assignment operator | ||
| 50 | + DeviceFinder& operator=(const DeviceFinder&) = delete; | ||
| 51 | + /// Deleted move-constructor | ||
| 52 | + DeviceFinder( DeviceFinder&& ) = delete; | ||
| 53 | + /// Deleted move operator | ||
| 54 | + DeviceFinder& operator=( DeviceFinder&& ) = delete; | ||
| 55 | + | ||
| 56 | + bool scanning() const; | ||
| 57 | + QList<DeviceInfo*> devices(); | ||
| 58 | + QString getAddressByName( const QString &name ); | ||
| 59 | + | ||
| 60 | +public slots: | ||
| 61 | + void slotStartSearch(); | ||
| 62 | + void slotConnectToService( const QString &address ); | ||
| 63 | + void slotAddDevice( const QBluetoothDeviceInfo &device ); | ||
| 64 | + void slotScanError( QBluetoothDeviceDiscoveryAgent::Error error ); | ||
| 65 | + void slotScanFinished(); | ||
| 66 | + void slotDisconnect(); | ||
| 67 | + | ||
| 68 | +signals: | ||
| 69 | + void signalScanningChanged(); | ||
| 70 | + void signalDevicesChanged(); | ||
| 71 | + void signalScanFinished(); | ||
| 72 | + void signalSendData( const QString &data ); | ||
| 73 | + | ||
| 74 | +private: | ||
| 75 | + DeviceHandler *m_pDeviceHandler; | ||
| 76 | + QBluetoothDeviceDiscoveryAgent *m_pDeviceDiscoveryAgent; | ||
| 77 | + QList<DeviceInfo*> m_devices; | ||
| 78 | +}; | ||
| 79 | + | ||
| 80 | +} /* End namespace bluetooth */ | ||
| 81 | +} /* End namespace components */ | ||
| 82 | +} /* End namepsace osdev */ | ||
| 83 | + | ||
| 84 | +#endif /* OSDEV_COMPONENTS_BLUETOOTH_DEVICEFINDER_H */ |
src/devicehandler.cpp
0 → 100644
| 1 | +++ a/src/devicehandler.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +// osdev::components::bluetooth | ||
| 23 | +#include "devicehandler.h" | ||
| 24 | +#include "deviceinfo.h" | ||
| 25 | +#include <QtEndian> | ||
| 26 | +#include <QRandomGenerator> | ||
| 27 | +#include <QScopedPointer> | ||
| 28 | + | ||
| 29 | +using namespace osdev::components::bluetooth; | ||
| 30 | + | ||
| 31 | +DeviceHandler::DeviceHandler( QObject *parent ) | ||
| 32 | + : BluetoothBaseClass( parent ) | ||
| 33 | + , m_pControl( nullptr ) | ||
| 34 | + , m_pService( nullptr ) | ||
| 35 | + , m_notificationDescriptor() | ||
| 36 | + , m_pCurrentDevice( nullptr ) | ||
| 37 | + , m_foundRequestedService( false ) | ||
| 38 | + , m_measuring( false ) | ||
| 39 | + , m_measurements() | ||
| 40 | + , m_addressType( QLowEnergyController::PublicAddress ) | ||
| 41 | + , m_requestedServiceUuid() | ||
| 42 | + , m_requestedCharacteristicUuid() | ||
| 43 | +{ | ||
| 44 | + | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +void DeviceHandler::setAddressType( AddressType type ) | ||
| 48 | +{ | ||
| 49 | + switch( type ) | ||
| 50 | + { | ||
| 51 | + case DeviceHandler::AddressType::PublicAddress: | ||
| 52 | + { | ||
| 53 | + m_addressType = QLowEnergyController::PublicAddress; | ||
| 54 | + break; | ||
| 55 | + } | ||
| 56 | + case DeviceHandler::AddressType::RandomAddress: | ||
| 57 | + { | ||
| 58 | + m_addressType = QLowEnergyController::RandomAddress; | ||
| 59 | + break; | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +DeviceHandler::AddressType DeviceHandler::addressType() const | ||
| 65 | +{ | ||
| 66 | + if( m_addressType == QLowEnergyController::RandomAddress ) | ||
| 67 | + return DeviceHandler::AddressType::RandomAddress; | ||
| 68 | + | ||
| 69 | + return DeviceHandler::AddressType::PublicAddress; | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +void DeviceHandler::setDevice( DeviceInfo *device ) | ||
| 73 | +{ | ||
| 74 | + clearMessages(); | ||
| 75 | + m_pCurrentDevice = device; | ||
| 76 | + | ||
| 77 | + // Disconnect and delete old connection | ||
| 78 | + if( m_pControl ) | ||
| 79 | + { | ||
| 80 | + m_pControl->disconnectFromDevice(); | ||
| 81 | + delete m_pControl; | ||
| 82 | + m_pControl = nullptr; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + // Create new controller and connect it if device is available. | ||
| 86 | + if( m_pCurrentDevice ) | ||
| 87 | + { | ||
| 88 | + // Make connections | ||
| 89 | + //! [connect signals-1] | ||
| 90 | + m_pControl = QLowEnergyController::createCentral( m_pCurrentDevice->getDevice(), this ); | ||
| 91 | + m_pControl->setRemoteAddressType( m_addressType ); | ||
| 92 | + | ||
| 93 | + connect( m_pControl, &QLowEnergyController::serviceDiscovered, this, &DeviceHandler::slotServiceDiscovered ); | ||
| 94 | + connect( m_pControl, &QLowEnergyController::discoveryFinished, this, &DeviceHandler::slotServiceScanDone ); | ||
| 95 | + connect( m_pControl, | ||
| 96 | + static_cast<void (QLowEnergyController::*)(QLowEnergyController::Error)>(&QLowEnergyController::error), | ||
| 97 | + this, | ||
| 98 | + [this](QLowEnergyController::Error error) | ||
| 99 | + { | ||
| 100 | + Q_UNUSED( error ); | ||
| 101 | + emit signalConnectionStateChanged( false ); | ||
| 102 | + setError( "Cannot connect to remote device." ); | ||
| 103 | + } | ||
| 104 | + ); | ||
| 105 | + connect( m_pControl, &QLowEnergyController::disconnected, this, [this]() | ||
| 106 | + { | ||
| 107 | + emit signalConnectionStateChanged( false ); | ||
| 108 | + setError( "LowEnergy controller disconnected" ); | ||
| 109 | + }); | ||
| 110 | + connect( m_pControl, &QLowEnergyController::connected, this, [this]() | ||
| 111 | + { | ||
| 112 | + emit signalConnectionStateChanged( true ); | ||
| 113 | + setInfo( "LowEnergy controller connected... Search Services" ); | ||
| 114 | + m_pControl->discoverServices(); | ||
| 115 | + }); | ||
| 116 | + | ||
| 117 | + // Connect | ||
| 118 | + m_pControl->connectToDevice(); | ||
| 119 | + } | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +void DeviceHandler::setRequestedServiceUuid( const QBluetoothUuid &service_uuid ) | ||
| 123 | +{ | ||
| 124 | + m_requestedServiceUuid = service_uuid; | ||
| 125 | +} | ||
| 126 | + | ||
| 127 | +QBluetoothUuid DeviceHandler::requestedServiceUuid() const | ||
| 128 | +{ | ||
| 129 | + return m_requestedServiceUuid; | ||
| 130 | +} | ||
| 131 | + | ||
| 132 | +void DeviceHandler::setRequestedCharacteristicUuid( const QBluetoothUuid &char_uuid ) | ||
| 133 | +{ | ||
| 134 | + m_requestedCharacteristicUuid = char_uuid; | ||
| 135 | +} | ||
| 136 | + | ||
| 137 | +QBluetoothUuid DeviceHandler::requestedCharacteristicUuid() const | ||
| 138 | +{ | ||
| 139 | + return m_requestedCharacteristicUuid; | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +void DeviceHandler::slotStartMeasurement() | ||
| 143 | +{ | ||
| 144 | + | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | +void DeviceHandler::slotStopMeasurement() | ||
| 148 | +{ | ||
| 149 | + | ||
| 150 | +} | ||
| 151 | + | ||
| 152 | +void DeviceHandler::slotServiceDiscovered( const QBluetoothUuid &gatt ) | ||
| 153 | +{ | ||
| 154 | + if( gatt == m_requestedServiceUuid ) | ||
| 155 | + { | ||
| 156 | + setInfo( "Requested service discovered. Waiting for service scan to be done..." ); | ||
| 157 | + m_foundRequestedService = true; | ||
| 158 | + } | ||
| 159 | +} | ||
| 160 | + | ||
| 161 | +void DeviceHandler::slotServiceScanDone() | ||
| 162 | +{ | ||
| 163 | + setInfo( "Service scan done." ); | ||
| 164 | + | ||
| 165 | + // Delete old service if available. | ||
| 166 | + if( m_pService ) | ||
| 167 | + { | ||
| 168 | + delete m_pService; | ||
| 169 | + m_pService = nullptr; | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + // If Requested service is found, create a new service. | ||
| 173 | + if( m_foundRequestedService ) | ||
| 174 | + m_pService = m_pControl->createServiceObject( m_requestedServiceUuid, this ); | ||
| 175 | + | ||
| 176 | + if( m_pService ) | ||
| 177 | + { | ||
| 178 | + qInfo() << "Connected to service : " << m_requestedServiceUuid; | ||
| 179 | + connect( m_pService, &QLowEnergyService::stateChanged, this, &DeviceHandler::slotServiceStateChanged ); | ||
| 180 | + connect( m_pService, &QLowEnergyService::characteristicChanged, this, &DeviceHandler::slotUpdateMeasuredValue ); | ||
| 181 | + connect( m_pService, &QLowEnergyService::descriptorWritten, this, &DeviceHandler::slotConfirmedDescriptorWrite ); | ||
| 182 | + m_pService->discoverDetails(); | ||
| 183 | + } | ||
| 184 | + else | ||
| 185 | + { | ||
| 186 | + setError( "Requested Service was not found." ); | ||
| 187 | + } | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +void DeviceHandler::slotServiceStateChanged( QLowEnergyService::ServiceState state ) | ||
| 191 | +{ | ||
| 192 | + switch( state ) | ||
| 193 | + { | ||
| 194 | + case QLowEnergyService::DiscoveringServices: | ||
| 195 | + setInfo( tr("Discovering Services..." ) ); | ||
| 196 | + break; | ||
| 197 | + case QLowEnergyService::ServiceDiscovered: | ||
| 198 | + { | ||
| 199 | + setInfo( tr( "Service discovered." ) ); | ||
| 200 | + | ||
| 201 | + const QLowEnergyCharacteristic fChar = m_pService->characteristic( m_requestedCharacteristicUuid ); | ||
| 202 | + if( !fChar.isValid() ) | ||
| 203 | + { | ||
| 204 | + setError( "Requasted Data not Found." ); | ||
| 205 | + break; | ||
| 206 | + } | ||
| 207 | + | ||
| 208 | + m_notificationDescriptor = fChar.descriptor( QBluetoothUuid::ClientCharacteristicConfiguration ); | ||
| 209 | + if( m_notificationDescriptor.isValid() ) | ||
| 210 | + { | ||
| 211 | + m_pService->writeDescriptor( m_notificationDescriptor, QByteArray::fromHex( "0100" ) ); | ||
| 212 | + } | ||
| 213 | + break; | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + default: | ||
| 217 | + // nothing for now | ||
| 218 | + break; | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + emit signalAliveChanged(); | ||
| 222 | +} | ||
| 223 | + | ||
| 224 | +void DeviceHandler::slotUpdateMeasuredValue( const QLowEnergyCharacteristic &c, const QByteArray &value ) | ||
| 225 | +{ | ||
| 226 | + // Ignore any other characteristic change -> shouldn't really happen, though | ||
| 227 | + if( c.uuid() != m_requestedCharacteristicUuid ) | ||
| 228 | + return; | ||
| 229 | + | ||
| 230 | + qInfo() << "QByteArray() : " << value << " => Size : " << value.size(); | ||
| 231 | + | ||
| 232 | + QString read_value = QString( value ); | ||
| 233 | + emit signalReceivedValue( read_value ); | ||
| 234 | +} | ||
| 235 | + | ||
| 236 | +void DeviceHandler::slotConfirmedDescriptorWrite( const QLowEnergyDescriptor &d, const QByteArray &value ) | ||
| 237 | +{ | ||
| 238 | + if( d.isValid() && d == m_notificationDescriptor && value == QByteArray::fromHex( "0000" ) ) | ||
| 239 | + { | ||
| 240 | + // disabled notifications -> assume disconnect intent | ||
| 241 | + m_pControl->disconnectFromDevice(); | ||
| 242 | + delete m_pService; | ||
| 243 | + m_pService = nullptr; | ||
| 244 | + } | ||
| 245 | +} | ||
| 246 | + | ||
| 247 | +void DeviceHandler::slotDisconnectService() | ||
| 248 | +{ | ||
| 249 | + m_foundRequestedService = false; | ||
| 250 | + | ||
| 251 | + // disable notifications | ||
| 252 | + if( m_notificationDescriptor.isValid() && m_pService && m_notificationDescriptor.value() == QByteArray::fromHex( "0100" ) ) | ||
| 253 | + { | ||
| 254 | + m_pService->writeDescriptor( m_notificationDescriptor, QByteArray::fromHex( "0000" ) ); | ||
| 255 | + } | ||
| 256 | + else | ||
| 257 | + { | ||
| 258 | + if( m_pControl ) | ||
| 259 | + m_pControl->disconnectFromDevice(); | ||
| 260 | + | ||
| 261 | + delete m_pService; | ||
| 262 | + m_pService = nullptr; | ||
| 263 | + } | ||
| 264 | +} | ||
| 265 | + | ||
| 266 | +bool DeviceHandler::measuring() const | ||
| 267 | +{ | ||
| 268 | + return m_measuring; | ||
| 269 | +} | ||
| 270 | + | ||
| 271 | +bool DeviceHandler::alive() const | ||
| 272 | +{ | ||
| 273 | + if( m_pService ) | ||
| 274 | + return m_pService->state() == QLowEnergyService::ServiceDiscovered; | ||
| 275 | + | ||
| 276 | + return false; | ||
| 277 | +} |
src/devicehandler.h
0 → 100644
| 1 | +++ a/src/devicehandler.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_BLUETOOTH_DEVICEHANDLER_H | ||
| 23 | +#define OSDEV_COMPONENTS_BLUETOOTH_DEVICEHANDLER_H | ||
| 24 | + | ||
| 25 | +#include "bluetoothbaseclass.h" | ||
| 26 | +#include "deviceinfo.h" | ||
| 27 | + | ||
| 28 | +#include <QDateTime> | ||
| 29 | +#include <QTimer> | ||
| 30 | +#include <QVector> | ||
| 31 | + | ||
| 32 | +#include <QLowEnergyController> | ||
| 33 | +#include <QLowEnergyService> | ||
| 34 | + | ||
| 35 | +namespace osdev { | ||
| 36 | +namespace components { | ||
| 37 | +namespace bluetooth { | ||
| 38 | + | ||
| 39 | +class DeviceHandler : public BluetoothBaseClass | ||
| 40 | +{ | ||
| 41 | + Q_OBJECT | ||
| 42 | + | ||
| 43 | +public: | ||
| 44 | + enum class AddressType | ||
| 45 | + { | ||
| 46 | + PublicAddress, | ||
| 47 | + RandomAddress | ||
| 48 | + }; | ||
| 49 | + | ||
| 50 | + DeviceHandler( QObject *parent = nullptr ); | ||
| 51 | + | ||
| 52 | + /// Deleted copy-constructor | ||
| 53 | + DeviceHandler( const DeviceHandler& ) = delete; | ||
| 54 | + /// Deleted assignment operator | ||
| 55 | + DeviceHandler& operator=(const DeviceHandler&) = delete; | ||
| 56 | + /// Deleted move-constructor | ||
| 57 | + DeviceHandler( DeviceHandler&& ) = delete; | ||
| 58 | + /// Deleted move operator | ||
| 59 | + DeviceHandler& operator=( DeviceHandler&& ) = delete; | ||
| 60 | + | ||
| 61 | + void setDevice( DeviceInfo *device ); | ||
| 62 | + void setAddressType( AddressType type ); | ||
| 63 | + AddressType addressType() const; | ||
| 64 | + | ||
| 65 | + bool measuring() const; | ||
| 66 | + bool alive() const; | ||
| 67 | + | ||
| 68 | + void setRequestedServiceUuid( const QBluetoothUuid &service_uuid ); | ||
| 69 | + QBluetoothUuid requestedServiceUuid() const; | ||
| 70 | + | ||
| 71 | + void setRequestedCharacteristicUuid( const QBluetoothUuid &char_uuid ); | ||
| 72 | + QBluetoothUuid requestedCharacteristicUuid() const; | ||
| 73 | + | ||
| 74 | +signals: | ||
| 75 | + void signalMeasuringChanged(); | ||
| 76 | + void signalAliveChanged(); | ||
| 77 | + void signalConnectionStateChanged( bool state ); | ||
| 78 | + void signalStatsChanged(); | ||
| 79 | + | ||
| 80 | + void signalReceivedValue( const QString &value ); | ||
| 81 | + | ||
| 82 | +public slots: | ||
| 83 | + void slotStartMeasurement(); | ||
| 84 | + void slotStopMeasurement(); | ||
| 85 | + void slotDisconnectService(); | ||
| 86 | + | ||
| 87 | + // QLowEnergyController | ||
| 88 | + void slotServiceDiscovered( const QBluetoothUuid &gatt ); | ||
| 89 | + void slotServiceScanDone(); | ||
| 90 | + | ||
| 91 | + // QLowEnergyService | ||
| 92 | + void slotServiceStateChanged( QLowEnergyService::ServiceState state ); | ||
| 93 | + void slotUpdateMeasuredValue( const QLowEnergyCharacteristic &characteristic, const QByteArray &value ); | ||
| 94 | + void slotConfirmedDescriptorWrite( const QLowEnergyDescriptor &descriptor, const QByteArray &value ); | ||
| 95 | + | ||
| 96 | +private: | ||
| 97 | + QLowEnergyController *m_pControl; | ||
| 98 | + QLowEnergyService *m_pService; | ||
| 99 | + QLowEnergyDescriptor m_notificationDescriptor; | ||
| 100 | + DeviceInfo *m_pCurrentDevice; | ||
| 101 | + | ||
| 102 | + bool m_foundRequestedService; | ||
| 103 | + bool m_measuring; | ||
| 104 | + | ||
| 105 | + QVector<int> m_measurements; | ||
| 106 | + QLowEnergyController::RemoteAddressType m_addressType; | ||
| 107 | + QBluetoothUuid m_requestedServiceUuid; | ||
| 108 | + QBluetoothUuid m_requestedCharacteristicUuid; | ||
| 109 | +}; | ||
| 110 | + | ||
| 111 | +} /* End namespace bluetooth */ | ||
| 112 | +} /* End namespace components */ | ||
| 113 | +} /* End namespace osdev */ | ||
| 114 | + | ||
| 115 | +#endif /* OSDEV_COMPONENTS_BLUETOOTH_DEVICEHANDLER_H */ |
src/deviceinfo.cpp
0 → 100644
| 1 | +++ a/src/deviceinfo.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +// osdev::components::bluetooth | ||
| 23 | +#include "deviceinfo.h" | ||
| 24 | +// Qt | ||
| 25 | +#include <QBluetoothAddress> | ||
| 26 | +#include <QBluetoothUuid> | ||
| 27 | + | ||
| 28 | +using namespace osdev::components::bluetooth; | ||
| 29 | + | ||
| 30 | +DeviceInfo::DeviceInfo( const QBluetoothDeviceInfo &info, QObject *parent ) | ||
| 31 | + : QObject( parent ) | ||
| 32 | + , m_device( info ) | ||
| 33 | +{ | ||
| 34 | + | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +QBluetoothDeviceInfo DeviceInfo::getDevice() const | ||
| 38 | +{ | ||
| 39 | + return m_device; | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +QString DeviceInfo::getName() const | ||
| 43 | +{ | ||
| 44 | + return m_device.name(); | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +QString DeviceInfo::getAddress() const | ||
| 48 | +{ | ||
| 49 | +#if defined Q_OS_DARWIN | ||
| 50 | + return m_device.deviceUuid().toString(); | ||
| 51 | +#else | ||
| 52 | + return m_device.address().toString(); | ||
| 53 | +#endif | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +QString DeviceInfo::getUuid() const | ||
| 57 | +{ | ||
| 58 | + return m_device.deviceUuid().toString(); | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +void DeviceInfo::setDevice( const QBluetoothDeviceInfo &device ) | ||
| 62 | +{ | ||
| 63 | + m_device = device; | ||
| 64 | + emit signalDeviceChanged(); | ||
| 65 | +} |
src/deviceinfo.h
0 → 100644
| 1 | +++ a/src/deviceinfo.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | +#ifndef OSDEV_COMPONENTS_BLUETOOTH_DEVICEINFO_H | ||
| 23 | +#define OSDEV_COMPONENTS_BLUETOOTH_DEVICEINFO_H | ||
| 24 | + | ||
| 25 | +#include <QString> | ||
| 26 | +#include <QObject> | ||
| 27 | +#include <QBluetoothDeviceInfo> | ||
| 28 | + | ||
| 29 | +namespace osdev { | ||
| 30 | +namespace components { | ||
| 31 | +namespace bluetooth { | ||
| 32 | + | ||
| 33 | +class DeviceInfo : public QObject | ||
| 34 | +{ | ||
| 35 | + Q_OBJECT | ||
| 36 | + | ||
| 37 | +public: | ||
| 38 | + DeviceInfo( const QBluetoothDeviceInfo &device, QObject *parent = nullptr ); | ||
| 39 | + | ||
| 40 | + void setDevice( const QBluetoothDeviceInfo &device ); | ||
| 41 | + | ||
| 42 | + QString getName() const; | ||
| 43 | + QString getAddress() const; | ||
| 44 | + QString getUuid() const; | ||
| 45 | + QBluetoothDeviceInfo getDevice() const; | ||
| 46 | + | ||
| 47 | +signals: | ||
| 48 | + void signalDeviceChanged(); | ||
| 49 | + | ||
| 50 | +private: | ||
| 51 | + QBluetoothDeviceInfo m_device; | ||
| 52 | +}; | ||
| 53 | + | ||
| 54 | +} /* End namespace bluetooth */ | ||
| 55 | +} /* End namespace components */ | ||
| 56 | +} /* End namespace osdev */ | ||
| 57 | + | ||
| 58 | +#endif /* OSDEV_COMPONENTS_BLUETOOTH_DEVICEINFO_H */ |
tests/CMakeLists.txt
0 → 100644
| 1 | +++ a/tests/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) | ||
| 3 | + | ||
| 4 | +include(projectheader) | ||
| 5 | +project_header(test_logutils) | ||
| 6 | + | ||
| 7 | +include_directories( SYSTEM | ||
| 8 | + ${CMAKE_CURRENT_SOURCE_DIR}/../../src | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +include(compiler) | ||
| 12 | +set(SRC_LIST | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +# add_executable( ${PROJECT_NAME} | ||
| 16 | +# ${SRC_LIST} | ||
| 17 | +# ) | ||
| 18 | + | ||
| 19 | +# target_link_libraries( | ||
| 20 | +# ${PROJECT_NAME} | ||
| 21 | +# ) | ||
| 22 | + | ||
| 23 | +# set_target_properties( ${PROJECT_NAME} PROPERTIES | ||
| 24 | +# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin | ||
| 25 | +# LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib | ||
| 26 | +# ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/archive | ||
| 27 | +# ) | ||
| 28 | + | ||
| 29 | +# include(installation) | ||
| 30 | +# install_application() |