#include "service/common/bluetooth/advertise_settings.h"
#include "service/common/bluetooth/low_energy_constants.h"
#include "service/common/bluetooth/scan_filter.h"
+#include "service/common/bluetooth/scan_result.h"
#include "service/common/bluetooth/scan_settings.h"
#include "service/common/bluetooth/uuid.h"
#include "service/hal/bluetooth_gatt_interface.h"
namespace bluetooth {
+struct ConnComparator {
+ bool operator()(const bt_bdaddr_t& a, const bt_bdaddr_t& b) const {
+ return memcmp(&a, &b, sizeof(bt_bdaddr_t)) < 0;
+ }
+};
+
class Adapter;
// A LowEnergyClient represents an application's handle to perform various
class LowEnergyClient : private hal::BluetoothGattInterface::ClientObserver,
public BluetoothInstance {
public:
+ // The Delegate interface is used to notify asynchronous events related to BLE
+ // GAP operations.
+ class Delegate {
+ public:
+ Delegate() = default;
+ virtual ~Delegate() = default;
+
+ // Called asynchronously to notify the delegate of nearby BLE advertisers
+ // found during a device scan.
+ virtual void OnScanResult(LowEnergyClient* client,
+ const ScanResult& scan_result) = 0;
+
+ // Called asynchronously to notify the delegate of connection state change
+ virtual void OnConnectionState(LowEnergyClient* client, int status,
+ const char* address, bool connected) = 0;
+
+ // Called asynchronously to notify the delegate of mtu change
+ virtual void OnMtuChanged(LowEnergyClient* client, int status, const char* address,
+ int mtu) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Delegate);
+ };
+
// The destructor automatically unregisters this client instance from the
// stack.
~LowEnergyClient() override;
+ // Assigns a delegate to this instance. |delegate| must out-live this
+ // LowEnergyClient instance.
+ void SetDelegate(Delegate* delegate);
+
// Callback type used to return the result of asynchronous operations below.
using StatusCallback = std::function<void(BLEStatus)>;
+ // Initiates a BLE connection do device with address |address|. If
+ // |is_direct| is set, use direct connect procedure. Return true on success
+ //, false otherwise.
+ bool Connect(std::string address, bool is_direct);
+
+ // Disconnect from previously connected BLE device with address |address|.
+ // Return true on success, false otherwise.
+ bool Disconnect(std::string address);
+
+ // Sends request to set MTU to |mtu| for device with address |address|.
+ // Return true on success, false otherwise.
+ bool SetMtu(std::string address, int mtu);
+
// Initiates a BLE device scan for this client using the given |settings| and
// |filters|. See the documentation for ScanSettings and ScanFilter for how
// these parameters can be configured. Return true on success, false
// Returns the current advertising settings.
const AdvertiseSettings& advertise_settings() const {
- return advertise_settings_;
+ return advertise_settings_;
}
// Returns the current scan settings.
LowEnergyClient(Adapter& adapter, const UUID& uuid, int client_id);
// BluetoothGattInterface::ClientObserver overrides:
+ void ScanResultCallback(
+ hal::BluetoothGattInterface* gatt_iface,
+ const bt_bdaddr_t& bda, int rssi, uint8_t* adv_data) override;
+
+ void ConnectCallback(
+ hal::BluetoothGattInterface* gatt_iface, int conn_id, int status,
+ int client_id, const bt_bdaddr_t& bda) override;
+ void DisconnectCallback(
+ hal::BluetoothGattInterface* gatt_iface, int conn_id, int status,
+ int client_id, const bt_bdaddr_t& bda) override;
+ void MtuChangedCallback(
+ hal::BluetoothGattInterface* gatt_iface, int conn_id, int status,
+ int mtu) override;
void MultiAdvEnableCallback(
hal::BluetoothGattInterface* gatt_iface,
int client_id, int status) override;
// If true, then this client have a BLE device scan in progress.
std::atomic_bool scan_started_;
+ // Raw handle to the Delegate, which must outlive this LowEnergyClient
+ // instance.
+ std::mutex delegate_mutex_;
+ Delegate* delegate_;
+
+ // Protects device connection related members below.
+ std::mutex connection_fields_lock_;
+
+ // Maps bluetooth address to connection id
+ //TODO(jpawlowski): change type to bimap
+ std::map<const bt_bdaddr_t, int, ConnComparator> connection_ids_;
+
DISALLOW_COPY_AND_ASSIGN(LowEnergyClient);
};